《设计模式》之禅

在讲设计模式之前,我们首先要了解设计模式:

  • 单一原则(Single Responsibility Principle)
  • 里氏替换原则(LSP Liskov Substitution Principle)
  • 依赖倒置原则(Dependence Inversion Principle)
  • 接口隔离(Interface Segregation Principle)
  • 迪米特原则(Law Of Demeter LOD)
  • 开闭原则(Open Closed Principle)

即使之前没有专门看过这些原则,但是实际开发中或多或少都会用到。实际上,这些原则的目的只有一个:降低对象之间的耦合,增加程序的可复用性、可扩展性、可维护性。优秀的设计模式就是基于这些原则去实现的。

六大设计原则

一个类应只包含单一的职责。

* 类的复杂性降低,实现什么职责都有清晰明确的定义。
* 可读性提高,复杂性降低。
* 可维护性提高,可读性提高。
* 变更引起的风险降低。

使用父类的地方能够使用子类来替换,反之则不行。

* 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
* 子类中可以增加自己特有的方法(个性化)。
* 当子类的方法重载父类的方法时,方法的形参要比父类方法的输入参数更宽松。
* 当子类的方法实现父类的抽象方法时,方法的返回值要比父类更严格。
* 父类应当被尽量设计为抽象类或者接口,让子类继承父类或实现父接口。

抽象不应该依赖于细节,细节应当依赖于抽象。

* 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。
* 接口或抽象类不依赖于实现类。
* 实现类依赖接口或抽象类。
* 高层模块不应该依赖低层模块,应该去依赖抽象。

一个类对另一个类的依赖应该建立在最小的接口上。

* 一个类不应该依赖他不需要的接口。
* 接口的粒度要尽可能小,如果一个接口的方法过多,可以拆成多个接口。
* 接口可以多级继承。

一个类尽量不要与其他类发生关系。

* 一个类对其他类知道的越少,耦合越小。
* 当修改一个类时,其他类的影响就越小,发生错误的可能性就越小。

一个模块、类、函数应当是对修改关闭,扩展开放。

* 修改原有的代码可能会导致原本正常的功能出现问题。
* 因此,当需求有变化时,最好是通过扩展来实现,增加新的方法满足需求,而不是去修改原有代码。

23种设计模式

设计模式一般分为三类:创建型模式、结构型模式、行为型模式。

创建型模式简单来说就是用来创建对象的。一共有五种:单例模式、建造者模式、工厂方法模式、抽象工厂模式、原型模式。
单例模式 :确保某一个类只有一个实例,并且提供一个全局访问点。
建造者模式 : 用来创建复杂的复合对象。
工厂方法模式 :让子类来决定要创建哪个对象。
抽象工厂模式 :创建多个产品族中的产品对象。
原型模式 :通过复制原型来创建新对象。

行为型模式主要是描述类或者对象是怎样交互和怎样分配职责的。一共有十一种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
策略模式 :封装不同的算法,算法之间能互相替换。
状态模式 :根据不同的状态做出不同的行为。
责任链模式 :将事件沿着链去处理。
观察者模式 :状态发生改变时通知观察者,一对多的关系。
模板方法模式 :定义一套流程模板,根据需要实现模板中的操作。
迭代器模式 :提供一种方法顺序访问一个聚合对象中的各个元素。
备忘录模式 :保存对象的状态,在需要时进行恢复。
访问者模式 :稳定数据结构中,定义新的操作行为。
中介者模式 :将网状结构转变为星型结构,所有行为都通过中介。
解释器模式 :定义语法,并对其进行解释。
命令模式 :将请求封装成命令,并记录下来,能够撤销与重做。

结构型模式主要是用于处理类或者对象的组合。一共有七种:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
代理模式 :控制客户端对对象的访问。
组合模式 :将整体与局部(树形结构)进行递归组合,让客户端能够以一种的方式对其进行处理。
适配器模式 :将原来不兼容的两个类融合在一起。
装饰者模式 :为对象添加新功能。
享元模式 :使用对象池来减少重复对象的创建。
外观模式 :对外提供一个统一的接口用来访问子系统。
桥接模式 :将两个能够独立变化的部分分离开来。

另外,除了这23种经典的设计模式,还涌现出其他的一些新的设计模式,比如:规格模式、对象池模式、雇工模式、黑板模式和空对象模式等等。后面有时间的话也会对这些模式进行分析。


参考文章

设计模式之六大设计原则
Android的设计模式-设计模式的六大原则

你可能感兴趣的:(《设计模式》之禅)