摘要:开放封闭原则是面向对象设计的核心所在,遵循这个原则可以避免许多不可避免的麻烦。而且能极大的增加软件的可扩展性可维护性和可复用性。依赖倒转原则定义高层模块不应该依赖低层模块。
1.最重要的原则:开放-封闭原则
定义:原件实体(类、模块、函数等等)应该可以扩展,但是不可修改
public class Calculate { public void operate(int a, int b, String symbol) throws Exception { if (symbol.equals("+")) { System.out.println("结果为" + (a + b)); } else if (symbol.equals("-")) { System.out.println("结果为" + (a - b)); } else if (symbol.equals("*")) { System.out.println("结果为" + a * b); } else if (symbol.equals("/")) { System.out.println("结果为" + a / b); } else { throw new Exception("非法操作符!"); } } } public class Test { public static void main(String[] args) throws Exception { Calculate c = new Calculate(); c.operate(10, 5, "+");// 结果为15 c.operate(10, 5, "-");// 结果为5 c.operate(10, 5, "*");// 结果为50 c.operate(10, 5, "/");// 结果为2 c.operate(10, 5, "^");// 此操作为乘方,抛出异常:非法操作符 } }
结果显而易见,最开始我们要做四则运算,后来又想加入乘方运算,由于程序最初的时候并没有考虑到乘方的运算,此时就得更改源代码;举一反三,三角函数的运算怎么办?再次违反开放-封闭原则改变源代码?所以,在需求变化时,一个类(单元,最好具有原子性,也有可能是方法)的功能要尽可能的唯一,只做一件事。 开放-封闭原则是面向对象设计的核心所在,遵循这个原则可以避免许多不可避免的麻烦。而且能极大的增加软件的可扩展性、可维护性和可复用性。2.单一职能原则
定义:就一个类而言,应该仅有一个引起它变化的原因
还是四则运算,在这里我们把它做一个重构
/** * 抽象工厂 */ interface IFactory { Integer result(int a,int b); } /** * 加法工厂 */ class AddFactory implements IFactory { @Override public Integer result(int a,int b) { return a+b; } } /** * 减法工厂 */ class SubFactory implements IFactory { @Override public Integer result(int a, int b) { return a-b; } } /** * 乘法工厂 */ class MulFactory implements IFactory { @Override public Integer result(int a, int b) { return a*b; } } /** * 除法工厂 */ class DivFactory implements IFactory { @Override public Integer result(int a, int b) { return a/b; } } /** * 测试不再赘述,为了省事没有抛异常 :) */ public static void main(String[] args) throws Exception { IFactory factory = new AddFactory(); Integer result = factory.result(10, 5); System.out.println(result);// 15 }
这样的话,如果再引起需求变动,(假设我们就是两个数的运算),直接增加类实现IFactory接口就可以了,是不是很方便(#^.^#),保证了开放-封闭原则的基础上,单一职能。
3.依赖倒转原则定义:
a.高层模块不应该依赖低层模块。两个都应该依赖抽象。
b.抽象不应该依赖细节,细节应该依赖抽象。
说白了,要尽量针对抽象(abstract)类编程,或者针对接口(interface)编程(第二段代码),不要针对实现编程(第一段代码)。
再举个栗子:就拿U盘的插口为例吧。U盘作为读写信息的一个媒介,需要连入到PC机上,如果全世界不统一为一个USB接口的话,那么只做U盘的厂商要针对联想做一种,Mac做一种,戴尔做一种……想想都很可怕,所以才会出现USB接口规范这个抽象的概念,大家针对这个规范制作U盘就可以了。
定义:子类型必须能够替换掉他们的父类型
public class Father { public void doSome(){ System.out.println("做数学运算"); } } public class Son extends Father { public void method() { System.out.println("做语文运算"); } } public static void main(String[] args) { Father test = new Son(); test.doSome(); }
可能我这里举的栗子不太恰当,但也反映出我想表达的意思了;就是说子类所重写的方法完全不是父类所需要的方法了,这对客户端来说是不可思议的。
5.迪米特法则定义:如果两个类不必彼此直接通信,那么这两个雷就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
根本思想就是强调了类之间的松耦合
举个栗子:你公司的维修部管维修电子设备,其中一个专人A负责修PC机;你电脑坏了,需要修理,打电话给A,A恰好不在,需要等到A回来才能修电脑,但是你又急用电脑,造成了公司资源的浪费(专人A相当于维修部的一个实例,也就是对象)。
换个角度考虑,公司所有人都可以维修PC机,你直接给维修部打电话,要他们派人过来维修你的电脑(这时候,只是维修部需要关心派谁去维修电脑,你就不需要关心是谁来了)。不针对具体,只针对抽象.
定义:一个接口拥有的行为应该尽可能的少
举个栗子:一般手机只需要满足打电话发短信就OK了,不需要其它额外的行为;由此可以衍生出新的接口,智能手机继承手机,添加新行为:玩王者荣耀,老年机玩不了王者荣耀,只有现在的智能机才能玩王者荣耀,如果把playKingOfGlory方法作为Phone接口中的方法就显得不太合适了。
public interface Phone { void call(); void sendMessage(); } public interface SmartPhone extends Phone{ public void playKingOfGlory(); }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70571.html
摘要:设计模式提供六个基本原则,分别是开闭原则单一职责原则里氏替换原则依赖倒置原则接口隔离原则迪米特法则开闭原则对扩展开放,对修改关闭。总结六大设计原则是代码设计的基本原则。 JAVA设计模式提供六个基本原则,分别是: 开闭原则(OCP) - The Open-Closed Principle 单一职责原则(SRP) - Single Responsibility Principle 里氏...
摘要:首先先祝大家国庆节快乐今天距离为我运营公众号已经一个月了,今天把文章整合一下,希望对大家有帮助,也谢谢朋友的支持,我会继续坚持原创,写更好的文章给大家一视频获取学习资源分享合集二功能篇实现金额的语音播报功能基于模式风格的封装之路炫酷动画跳 showImg(https://segmentfault.com/img/remote/1460000011437678?w=900&h=500);...
摘要:首先先祝大家国庆节快乐今天距离为我运营公众号已经一个月了,今天把文章整合一下,希望对大家有帮助,也谢谢朋友的支持,我会继续坚持原创,写更好的文章给大家一视频获取学习资源分享合集二功能篇实现金额的语音播报功能基于模式风格的封装之路炫酷动画跳 showImg(https://segmentfault.com/img/remote/1460000011437678?w=900&h=500);...
摘要:方法比如一个修改用户名和密码的需求,我们把它写在一个方法里天津市上述代码的方法职责不明确,既有修改用户名又修改地址,不符合单一职责原则。 Android学习资源分享合集(1)-视频资源 简介: 单一职责原则(SRP:Single responsibility principle),它规定一个类应该只有一个发生变化的原因。所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这...
阅读 3648·2021-10-18 13:34
阅读 2351·2021-08-11 11:15
阅读 1111·2019-08-30 15:44
阅读 654·2019-08-26 10:32
阅读 955·2019-08-26 10:13
阅读 2033·2019-08-23 18:36
阅读 1731·2019-08-23 18:35
阅读 491·2019-08-23 17:10