设计模式最早由Gang of Four四人小组归纳了23种在软件开发中使用频率较高的设计模式,并在1995年整理汇编成《Design Patterns:Elements of Reusable Object-Oriented Software》
一、设计模式的分类
总体来说设计模式分为三大类:
创建型模式,共五种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:职责链模式、命令模式、解释器模式、策略模式、模板方法模式、观察者模式、迭代器模式、备忘录模式、状态模式、访问者模式、中介者模式。
其中使用频率由高到低依次是
- 工厂方法模式、抽象工厂模式、外观模式、观察者模式、迭代器模式、
- 单例模式、适配器模式、组合模式、代理模式、命令模式、策略模式、
- (简单工厂模式)、桥接模式、装饰模式、状态模式、模板方法模式、原型模式
- 建造者模式、职责链模式、中介者模式、备忘录模式、
- 享元模式、解释器模式、访问者模式、
二、设计模式的七种常见原则
按照使用频率排序如下:
1、开闭原则(Open-Close Principle)
开闭原则就是说对扩展开放,对修改关闭。
2、里氏代换原则(Liskov Substitution Principle)
任何基类可以出现的地方,子类一定可以出现。
3、依赖倒转原则(Dependence Inversion Principle)
抽象不应该依赖于细节,细节应该依赖于抽象。
4、合成复用原则(Composite Reuse Principle)
尽量使用对象组合,而不是使用继承来达到复用的目的。
5、单一职责原则(Single Responsibility Principle)
一个类只负责一个功能领域中的相应职责。
6、迪米特法则(最少知道原则)(Demeter Principle)
一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
7、接口隔离原则(Interface Segregation Principle)
使用多个专门的接口,而不是用单一的总接口。
三、原则详解
- 单一职责原则
-单一职责的核心思想是:一个类不能太“累”,一个类所承担的功能越多,就越不可能被复用。而且一个类承担的功能过多,当其中一个功能改动时,可能会影响到其他的功能。
单一职责是实现高内聚,低耦合的指导方针。
public class CustomerDataChart{
public void getConnection(){}//连接数据库
public void findCustomers(){}//查询客户信息
public void showChart(){}//显示图表
}
上面这个CustomerDataChart类明显就是承担职责过多。如果在其他类中也需要连接数据库或显示图表,代码不能复用。当CustomerDataChart有很多的时候,比如还有其他的UserDataChart,如果需要修改连接数据库的方式或是显示图表的方式,则会有大量的重复工作。所以需要对该类进行拆分。
- 开闭原则
-一个软件实体应该对扩展开放,对修改关闭。软件实体可以指一个软件模块,一个或多个类组成的结构。 如果一个软件符合开闭原则,那么可以非常方便的对系统进行扩展,而无需修改现有代码。
抽象化是开闭原则的关键,定义系统的抽象层,再通过具体类来进行扩展。如果需要修改系统的行为,只需要增加新的具体类来实现新的业务。 - 里氏代换原则
-所有引用父类的地方都可以替换成引用子类,程序不会有任何异常。
在程序中使用父类类型来定义对象,在运行时在确定子类,这样可以很方便的扩展系统功能,只需新增子类就可以了。 依赖倒转原则
-抽象不应该依赖于细节,细节应该依赖于抽象。即,针对接口编程,而不是针对实现编程。合成复用原则
- 迪米特法则
- 接口隔离原则