设计模式是我们在软件开发过程中,基于特定情况的下为一些重复性出现的问题提供的一个有效的解决方案。无论是在框架还是应用软件的开发中,设计模式的在被广泛的应用。
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。
虽然设计模式只有23种,但是每一个设计模式都某一个可重复的设计问题提供了一套解决方案。根据他们的用途可以分为创建型,结构型和行为型三种。其中创建型模式主要用于描述如何创建对象,结构型模式主要用于描述如何实现类或对象的组合,行为型模式主要用于描述类或对象怎么交互以及怎么分配职责。在GoF23种设计模式中包含5种创建型设计模式,7种结构型设计模式和11种行为型设计模式。
1. 单例模式
2. 工厂方法模式
3. 抽象工厂模式
4. 原型模式
5. 建造者模式
1. 适配器模式
2. 桥接模式
3. 组合模式
4. 装饰模式
5. 外观模式
6. 享元模式
7. 代理模式
1. 职责链模式
2. 命令模式
3. 解释器模式
4. 迭代器模式
5. 中介者模式
6. 备忘录模式
7. 观察者模式
8. 状态模式
9. 策略模式
10. 模板方法模式
11. 访问者模式
单一职责原则是最简单的面向对象设计原则,他用于控制类的粒度大小。单一职责原则意思是说一个类只负责一个功能领域的事情,如果一个类承担的职责越多,那么他的可复用性就越小,耦合性也会变高,但其中一个职责发生变化时,很可能也会导致其他职责的变化。单一职责是实现高内聚,低耦合的指导方针。
开闭原则是面向对象的可复用性设计的基石。开闭原则意思是对扩展开放,对修改关闭。即实体应该在不修改原有代码的基础上进行扩展。这个实体可以是一个模块,一个由多个类组成的局部结构或一个独立的类。抽象化是开闭原则的关键。
里氏替换原则意思是所有引用基类(父类)的地方必须能透明地使用其子类对象。在软件中将一个基类对象替换成他的子类对象,程序将不会产生任何错误喝异常,但是反之则不可以,如果一个软件实体使用的是一个子类对象的话,那么他不一定能够使用基类对象。里氏替换原则是实现开闭原则的重要方式之一。
在使用里氏替换原则时需要注意一下几点:
如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要实现机制之一。依赖倒转原则意思是抽象不应该依赖于细节,细节应当依赖抽象,换言之,要针对接口编程,而不是针对实现编程。在实现依赖倒转原则时,我们需要针对抽象层编程,而将具体类的对象通过依赖注入的方式注入到其他对象中。
接口隔离原则意思是使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些他不需要的接口。当一个接口太大时,我们需要将他分割成一些更小的接口,使用该接口的客户端只需要知道与之相关的方法。每一个接口应该只承担相对独立的角色。
复用原则意思是尽量使用对象组合,而不是继承来达到复用的目的。就是在一个新对象里通过关联关系来使用一些已有的对象,使之成为新对象的一部分,新对象通过委派调用已有对象的方法达到使用功能的目的。
在面向对象设计中,可以通过两种方法在复用已有的实现,一种是通过组合的关系,一种是继承。但是应该优先考虑使用组合的方式,这样可以降低类之间的耦合,一个类的变化对其他类造成的影响就相对较少,其次在考虑使用继承的方式,并且需要严格遵守里氏替换原则,有效使用继承会有助于问题解决,滥用继承反而会增加系统复杂度。
通过继承来复用的主要问题在于破坏系统的封装性,因为继承会将基类的实现暴露给子类,如果基类发生改变,那么子类的实现也不得不发生改变。
迪米特原则意思是一个实体应当尽可能少的与其他实体发生相互作用。如果一个系统符合迪米特原则,那么当其中某个模块发生改变时,就会尽量少的影响其他模块。该原则可以降低系统的耦合度。