《设计模式笔记》之01七大原则
单一职责原则
-
核心
一个类只负责一项职责
-
优点
- 降低类的复杂度
- 提高类的可读性和可维护性
- 降低变更引起的风险
- 如果逻辑比较简单,可以在方法上遵守单一职责,降低代码量
-
实例
-
交通工具
分为轮船,飞机、汽车。每个类实现一个职责
-
DAO类
一个DAO负责一个表的增删改查。
-
-
代码
代码部分参考了尚硅谷韩顺平老师的内容。
/** * @program:design_pattern * @descript:公路 * @author: luyongjian746 * @create: 2020-02-11 */ public class Road { public void run(String vehicle) { System.out.println(vehicle + "在公路上跑"); } }
/** * @program:design_pattern * @descript:天空 * @author: luyongjian746 * @create: 2020-02-11 */ public class Sky { public void run(String vehicle) { System.out.println(vehicle + "在空中飞"); } }
/** * @program:design_pattern * @descript:海 * @author: luyongjian746 * @create: 2020-02-11 */ public class Sea { public void run(String vehicle) { System.out.println(vehicle + "在海中航行"); } }
/** * @program:design_pattern * @descript:测试 * @author: luyongjian746 * @create: 2020-02-11 */ public class Test { public static void main(String[] args) { Road road = new Road(); road.run("汽车"); Sky sky = new Sky(); sky.run("飞机"); Sea sea = new Sea(); sea.run("轮船"); } }
结果:
汽车在公路上跑 飞机在空中飞 轮船在海中航行
接口隔离原则
-
核心
客户端不应该依赖于他不需要的接口。即一个类对另外一个类的依赖,应该建立在最小的接口上。
将大接口拆解成多个小的接口。
-
作用
- 将臃肿庞大的接口分解为多个粒度小的接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。
- 接口隔离提高了系统的内聚性,减少了对外交互,降低了系统的耦合性。
- 如果接口的粒度大小定义合理,能够保证系统的稳定性;但是,如果定义过小,则会造成接口数量过多,使设计复杂化;如果定义太大,灵活性降低,无法提供定制服务,给整体项目带来无法预料的风险。
- 使用多个专门的接口还能够体现对象的层次,因为可以通过接口的继承,实现对总接口的定义。
- 能减少项目工程中的代码冗余。过大的大接口里面通常放置许多不用的方法,当实现这个接口的时候,被迫设计冗余的代码。
依赖倒置原则
-
核心
高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。
其核心思想是:要面向接口编程,不要面向实现编程。
-
作用
依赖倒置原则可以降低类间的耦合性。
依赖倒置原则可以提高系统的稳定性。
依赖倒置原则可以减少并行开发引起的风险。
依赖倒置原则可以提高代码的可读性和可维护性。
里式替换原则
-
核心
子类继承父类时尽量不要重写父类的方法。
优点
实例
代码
开闭原则
-
核心
对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节。
-
作用
开闭原则是面向对象程序设计的终极目标,它使软件实体拥有一定的适应性和灵活性的同时具备稳定性和延续性。具体来说,其作用如下。
- 对软件测试的影响
软件遵守开闭原则的话,软件测试时只需要对扩展的代码进行测试就可以了,因为原有的测试代码仍然能够正常运行。
- 可以提高代码的可复用性
粒度越小,被复用的可能性就越大;在面向对象的程序设计中,根据原子和抽象编程可以提高代码的可复用性。
- 可以提高软件的可维护性
遵守开闭原则的软件,其稳定性高和延续性强,从而易于扩展和维护。
迪米特法则
-
核心
子类可以扩展父类的功能,但不能改变父类原有的功能。
如果不是直接朋友,在一个方法中出现了其他类的局部变量,就违反了迪米特法则。
直接朋友是指,某方法的参数,返回值所使用的类,则此类为该方法所属类的直接朋友。
-
作用
- 降低了类之间的耦合度,提高了模块的相对独立性。
- 由于亲合度降低,从而提高了类的可复用率和系统的扩展性。
合成复用原则
-
核心
尽量使用合成或复用代替继承。
合成:A类作为成员变量或者参数的形式出现在B类
复用:A类以new A()的方式出现在B类中
-
作用
- 它维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
- 新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口。
- 复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。