设计模式概览
1. 设计模式简介
设计模式是前辈们总结的面向对象编程的最佳实践,使用设计模式是为了可重用代码,让人更容易理解代码,保证代码的可靠性、可扩展性。 设计模式,就是套路,就是功夫,每种功夫可以使我们打倒一类敌人;每种设计模式,可以帮我们解决一类重复出现的问题。有了设计模式,也方便程序员之间切磋技艺。
让我们记住以下四个名字,Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides。1994年,他们出版了一本名为《Design Patterns - Elements of Reusable Object-Oriented Software 》 的书,拉开了软件开发历史上设计模式的大幕。上述四位,有个响亮的江湖称号叫Gang of Four (GOF),听着有点耳熟。
2. 设计模式原则
记住两个java开发的军规,一个是面向接口编程,而不是面向实现;另一个是组合优于继承。 把它们展开来说,就是设计模式遵循的几个原则:
开闭原则、里氏替换原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特法则、合成/聚合复用原则。
开闭原则
开闭原则(Open-Closed Principle, OCP):一个类(或者模块)应当尽量对扩展开放,对修改封闭。修改原来代码的逻辑,可能会导致原有的功能出错。 当我们不得不考虑修改原有代码的逻辑,或者扩展起来很痛苦的时候,也可以考虑重构相关代码。
里氏替换原则
里氏替换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方,都必须能替换成其子类的对象。 凡是能用java.util.List的地方,肯定都能用java.util.ArrayList替换。通常情况下,基类是接口或者抽象类,子类实现基类中未实现的方法,编码过程中IDE会帮助我们检查是否符合里氏替换原则;但这是对语法的检查,具体实现还要靠程序员自己注意。
依赖倒置原则
依赖倒转原则(Dependency Inversion Principle, DIP):抽象不应该依赖于细节,细节应当依赖于抽象。如果你熟悉Spring或者Guice,就应当秒懂了。编程时要面向接口编程,而不是针对实现来编程。我们在A类中调用B接口,那么A类代码里只出现B接口,不出现B接口的实现类,这就需要在A类代码之外的地方(例如配置文件)声明B接口的实现类。
单一职责原则
单一职责原则(SRP:Single responsibility principle):一个类(模块)只承担一种角色,不要在一个类里又连接数据库,又做业务逻辑操作。
接口隔离原则
接口隔离原则(Interface Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口。一个接口(角色)只担负一个职责。就像你想要去买台手机,商场非要搭车卖你一口锅,你心里会骂娘的;如果一个接口定义了太多的方法,但实现类不需要那么多,你猜实现类是什么感受。
迪米特法则
迪米特法则(Law of Demeter, LoD):一个软件实体应当尽可能少地与其他实体发生相互作用。它的初衷是降低类和类之间的耦合度。迪米特法则建议一个类只和朋友类交流,朋友类包括出现在成员变量、方法的输入输出参数中的类,而出现在方法体内部的类不属于朋友类。
组合/聚合复用原则
组合/聚合复用原则(Composition/Aggregate Reuse Principle, CARP):尽量使用对象组合,而不是通过继承来达到复用的目的。
3. 设计模式分类
《设计模式》一书中共总结了23中设计模式,这些设计模式被分为三类:创建型(Creational)、结构型(Structural)、行为型(Behavioral)。
创建型设计模式提供了一种创建对象的方式,隐藏了创建对象的逻辑,和通过new操作符来创建对象相比,提供了灵活和动态创建对象的可能性。创建型设计模式共有5个。
|序号 | 模式名称 | 英文名称 |链接
|--- |------------|------|----------|-------|
|1 | 单例模式 | Singleton Pattern| http://www.jianshu.com/p/76a31fdc58bf|
|2 | 工厂方法模式 |Factory Method Pattern| http://www.jianshu.com/p/e7e2c46be749|
|3 | 抽象方法模式 |Abstract Factory Pattern| http://www.jianshu.com/p/7710ab882c05|
|4 | 原型模式 |Prototype Pattern | http://www.jianshu.com/p/204eb354f2fa|
|5 | 建造者模式 |Builder Pattern| http://www.jianshu.com/p/c96d517b660a|
结构型设计模式描述如何将类或对象结合在一起形成更大的结构。类可以通过继承或者实现接口的方式形成更大的结构,是静态的;不同的对象可以通过组合在一起实现更大的功能和结构,是动态的。结构型设计模式有7个。
序号 | 模式名称 | 英文名称 | 链接 |
---|---|---|---|
1 | 适配器模式 | Adapter Pattern | http://www.jianshu.com/p/cd1a608b1d45 |
2 | 装饰器模式 | Decorator Pattern | http://www.jianshu.com/p/6977a91f1ffb |
3 | 代理模式 | Proxy Pattern | http://www.jianshu.com/p/7ef38b4eb260 |
4 | 外观模式 | Facade Pattern | http://www.jianshu.com/p/2afea1141cd6 |
5 | 桥接模式 | Bridge Pattern | http://www.jianshu.com/p/a1e235eebabd |
6 | 组合模式 | Composite Pattern | http://www.jianshu.com/p/4e70962cc48a |
7 | 享元模式 | Flyweight Pattern | http://www.jianshu.com/p/dbd03d3a809c |
行为型设计模式重点关注对象之间的通信和交流。行为性设计模式有11个。
序号 | 模式名称 | 英文名称 | 链接 |
---|---|---|---|
1 | 责任链模式 | Chain of Responsibility Pattern | http://www.jianshu.com/p/fb9bf1b333d3 |
2 | 命令模式 | Command Pattern | http://www.jianshu.com/p/dac73756f507 |
3 | 解释器模式 | Interpreter Pattern | http://www.jianshu.com/p/8b0fdd5127f9 |
4 | 迭代模式 | Iterator Pattern | http://www.jianshu.com/p/d1a60decc24a |
5 | 中介模式 | Mediator Pattern | http://www.jianshu.com/p/062a86c01977 |
6 | 备忘录模式 | Memento Pattern | http://www.jianshu.com/p/cd8a9f6dbf54 |
7 | 观察者模式 | Observer Pattern | http://www.jianshu.com/p/78be191023ad |
8 | 状态模式 | State Pattern | http://www.jianshu.com/p/3628ad39d2bb |
9 | 策略模式 | Strategy Pattern | http://www.jianshu.com/p/90759e153ac9 |
10 | 模版方法模式 | Template Method Pattern | http://www.jianshu.com/p/4e4b8dabeb87 |
11 | 访问者模式 | Visitor Pattern | http://www.jianshu.com/p/cd17bae4e949 |