设计模式的优点
1、可扩展性:当客户提出新业务要求,程序可在较小的改动下进行功能扩展,也可视为可维护性
2、可读性:代码具有编程规范性,便于阅读和理解,适合多人合作
3、可靠性:添加新功能对原有功能无影响
4、高内聚、低耦合:事实上这个特点是程序一直追求的
七大设计原则
1.单一职责原则
介绍:一个类只负责一个职责
应用:类A有职责1,职责2,职责1需求变更时,进行改动类A,由于职责2依赖于类A,就可能造成职责2执行错误。将类A分解成类A 1,类A 2解决问题,即满足单一职责原则
优点:降低类的复杂度,提高代码可读性、可维护性
注意:遵守该原则分解类本身就需要付出代价,因此,通常情况下我们遵守该原则,但在逻辑足够简单时可以将该 原则级别降低,不在类级别遵守单一职责,而在方法级别遵守单一职责。什么时候逻辑足够简单呢?比如职责1只需要一个方法时,只需要将职责1设计成一个方法而不需要设计成一个类。
2.接口隔离原则
介绍:用户不需要依赖它不需要的接口,一个类对另一个类的依赖应建立在最小接口上
应用:interface 1有五个接口,类A需要使用接口1、2、3,故通过interface 1创建实现类B,类C需要使用接口4、5,故通过interface 1创建实现类D。类B和类C都需要实现五个接口,但类B不需要实现接口4、5,而类D不需要实现接口1、2、3,故interface 1对他们来说不是最小接口。将interface 1拆分成有接口1、2、3的interface 2、有接口4、5的interface 3即解决问题,将接口隔离起来,即满足接口隔离原则。
错误案例
正确
3.依赖倒置原则
介绍:抽象不应该依赖具体,具体应该依赖抽象;中心思想是面向接口编程
应用:具体类A有一个接受信息行为,类B实现接受电子信息,类A直接依赖具体类B,B作为参数传入A,如果该行为新增实现类C,类C实现接受邮件信息,而具体类A要使用新实现,则具体类A也要添加新改动,即需要将 C作为参数传入A。如果将类B继承interface 1,接收信息行为设置为interface 1的规范(即接口1),接受类作为参数传入A,则添加新实现只需新增实现类C继承interface 1,而不需要改动A。
错误案例
正确
优点:相对于具体的多变性,抽象要稳定的多。使用接口或抽象类的目的是定好规范,具体的细节实现交给他们的实现类去解决。
依赖传递:三种传递方式:接口传递,构造器传递,setter方法传递
注意:
- 低层模块尽量都有抽象的依赖。
- 变量引用时(new 对象时),尽量都是抽象类或接口,这样,模块和变量的引用之间就有了一个缓冲区,便于程序的扩展和优化。
- 继承时遵守里氏替换原则。
4.里氏替换原则
介绍:所有引用基类的地方必须能透明的(相当于直接替换)的使用其子类。遵守里氏替换原则,相当于要求子类尽量不要重写它的父类。
应用:定义父类Father和子类Son,他们有一个方法1。程序员A为了新功能将Son重写了方法1,程序员2使用Son的方法1,没有太注意,将方法1按照父类的定义来使用(因为一般看父类的注释不继续往下面看子类的),于是出现了bug。这时可以让Father和Son类继承一个更抽象的基类Base类,让Father和Son类继承Base类,重写的方法1放到Son类,原来的还是Father类。Father类想使用重写的方法1可以引入Son类
注意:继承实际上在一定程度上也让两个类有些耦合(父类修改时所有的子类会受到影响),适当情况下,可以通过聚合、组合和依赖的形式解决问题。
5.开闭原则
介绍:一个软件实体,如类、模块、函数应该对扩展开放(即提供方,新加的软件实体),对修改关闭(即使用方,原有的软件实体)。当变化时尽量通过扩展软件实体来实现要求,而不是修改已有细节。
应用:参考依赖倒置原则应用
注意:开闭原则是编程中最基础最通用的原则,编程中遵循其他原则以及使用设计模式即为了实现此原则
6.迪米特原则
介绍:一个类应该对另一个类保持最少的了解,只知道实现结果不需要知道过程,故又称“最少知道原则”。不论依赖的类内部逻辑多么复杂,尽量将其封装在自己内部,对外只提供方法,不泄露任何信息。
解析:此原则也就是只与最直接的朋友进行通信。类与类之间必然会有耦合关系,这种耦合可以称之为朋友。其中,称成员变量、方法参数、返回值中的类为最直接的朋友,而局部变量中的类不为直接朋友。陌生的类 最好不要以局部变量的形式出现在类的内部。
注意:
- 迪米特原则核心是降低类之间的耦合
- 迪米特原则只是降低类的耦合,不可能耦合完全消失
7.合成复用原则
介绍:尽量使用聚合/组合关系,而不是继承
应用:类A有抽象方法1,类B想使用方法1故而继承类A,然而当类A新增抽象方法2时类B就必须继承,增大耦合性。此时应该让B与A之间为组合/聚合关系。
设计模式类型
二十三种设计模式分类
三种类型 | 具体模式 |
---|---|
创建型 | 单例模式、工厂模式、抽象工厂模式、原型模式、建造者模式 |
结构型 | 适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式 |
行为型 | 模板方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、责任链模式(职责链模式) |