设计模式
关于模式
在讨论模式之前,必须对“模式”这个词加以界定,以规范后面的讨论和研究。
简而言之,人们在自己的环境中不断发现问题和寻找问题的解决方案的时候,发现有一些问题及其解决方案不断变换面孔反复出现,但在这些不同的面孔后面有着共同的本质,这些共同的本质就是模式。
一个围棋下得好的人知道,好的“形”对于围棋非常重要。形是棋子在棋盘上的几何形状的抽象化。形就是模式(pattern),也是人脑把握和认识外界的关键。模式化的过程是把问题抽象化,在忽略掉不重要的细节后,发现问题的一般性本质,并找到普遍使用的解决方案的过程。
设计模式的7个原则
开—闭原则(Open-Closed Principle,OCP)
一个软件实体应当对扩展开放,对修改关闭。
在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。换言之,应当可以在不必修改源代码的前提下改变这个模块的行为。
里氏代换原则(Liskov Substitution Principle,LSP)
一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根本不能察觉出基类对象和子类对象的区别。
反过来的代换不成立,即如果一个软件实体使用的是一个子类,那么它不一定适用于基类。
里氏代换要求凡是基类型使用的地方,子类型一定适用,因此子类必须具备基类型的全部接口。
依赖倒转原则(Dependence Inversion Principle,DIP)
依赖于抽象,而不依赖于具体。
针对接口编程。
传统的过程性系统的设计办法倾向于使高层次的模块依赖于低层次的模块;抽象层次依赖于具体层次。依赖倒转原则是要把这个错误的依赖关系倒转过来。
里氏代换原则是依赖倒转原则的基础,依赖倒转原则是开-闭原则的基础。
接口隔离原则(Interface Segregation Principle,ISP)
使用多个专门的接口比使用单一的总接口要好。
从一个客户类的角度来讲:一个类对另外一个类的依赖性应当是建立在最小的接口上的。
将“接口”理解为一个类所提供的所有方法的特征集合,也就是一种在逻辑上才存在的概念,这样的话,接口的划分就直接带来类型的划分。角色的合理划分。
将接口理解为狭义的java接口,这样一来,接口隔离原则讲的就是为同一个角色提供宽、窄不同的接口,以对付不同的客户端。定制服务。
合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)
在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。
尽量使用合成/聚合,尽量不要使用继承。
迪米特法则(Demeter Principle)
又叫做最少知识原则(Least Knowledge Principle,LKP)
一个对象应当对其他对象有尽可能少的了解。
只与你直接的朋友们通信;
不要跟“陌生人”说话;
每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
单一职责原则(Single Responsibility Principle, SRP)
一个类只负责一个功能领域中的相应职责。
设计模式的分类
创建模式(5种)
工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
结构模式(7种)
适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式
行为模式(11种)
策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式