在阅读其他源码的时候被好多设计模式卡主了,因此想的简单的学习一下设计模式。
参考: <<大话设计模式>>与<<Java与模式>>。
1. 什么是设计模式
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。
2. 设计模式分类
可以分为三大类:创建型模式(Creational Patterns)-5种、结构型模式(Structural Patterns)-7种、行为型模式(Behavioral Patterns)-11种。另外还有另一类设计模式:J2EE 设计模式。
序号 | 模式 & 描述 | 包括 |
---|---|---|
1 | 创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 |
|
2 | 结构型模式 这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。 |
|
3 | 行为型模式 这些设计模式特别关注对象之间的通信。 |
|
4 | J2EE 模式 这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。 |
|
3. 设计模式六大原则
1、开闭原则(Open Close Principle)
开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
2、里氏代换原则(Liskov Substitution Principle)
里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
3、依赖倒转原则(Dependence Inversion Principle)
这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。
5、迪米特法则,又称最少知道原则(Demeter Principle)
最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)
合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。
7. 单一职责原则
指在类层面,方法层面,接口层面的职能都是单一的。更准确的解释是:就一个类而言,应该仅有一个引起它变化的原因。
4. 自己的总结
创建型:对类的实例化过程的抽象。(官方语言是五种:工厂、抽象工厂、单例、建造者、原型)
分为类的创建模式和对象的创建模式两种:
类的创建模式:使用继承关系,把类的创建延迟到子类中,从而封装了客户端将得到哪些具体类的信息,并且隐藏了这些类的实例是如何被创建和放在一起的。
对象的创建模式:把对象的创建过程动态地委派给另一个对象。
1.简单工厂模式:一个简单的工厂类根据类型创建不同的产品,传入一个参数决定创建具体的产品。一般采用反射创建对象,扩展性更强。(一个 工厂创建多个产品)
2.工厂模式:具有一个抽象类工程和多个具体工厂,一个工厂创建一个或多个产品。比如WindowsButtonFactory生产WindowsButton,WindowsTextFactory生产WindowsText产品。
3.抽象工厂:具有一个抽象类工程和多个具体工厂,一个具体工厂生产一个具有相关联的产品,比如WindowsFactory生产WindowsButton和WindowsText。
4.单例模式:一个系统只有一个实例,比如一个国家一个总统,一个地球,JDK的Runtime等。
5.建造者模式:它一点一点地创建出一个复杂的产品,而这个产品的组装就发生在建造者角色内部。建造者模式的客户端拿到的是一个完整的最后产品。当构造方法参数过多时使用建造者模式
6.原始模式:通过复制实现创建对象,最常见的是基于流的深复制。
结构模式:描述如何将类或者对象结合在一起形成更大的结构。(官方语言是七种:适配器、合成、装饰、代理、享元、门面、桥梁)
结构模式描述两种不同的东西:类与类的实例。结构模式可以分为两种:类的结构模式和对象的结构模式。
类的结构模式:使用继承把类、接口等组合在一起,以形成更大的结构。
对象的结构模式:把各种不同类型的对象组合在一起以实现新的功能和方法。
1. 适配器模式:通过类适配器模式和对象适配器模式使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
2.合成模式:让客户端不再区分操作的是树枝对象还是树叶对象,而是以一个统一的方式来操作。
3.装饰模式:以对客户端透明的方式扩展对象的功能,是继承关系的另一个替代方案。
4.代理模式:给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
5.享元模式:以共享的方式高效地支持大量的细粒度对象。能做到共享的关键是内蕴状态和外蕴状态。
6.门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行就是门面模式
7.桥梁模式:一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立地变化。
行为模式:是对不同的对象之间划分责任和算法的抽象化。(官方语言是十一种:不变模式不属于官方的行为模式,剩下的11个都是)
1.不变模式:一个对象的状态在被创建之后就不再变化。(这个不在官方的行为模式中)
2.策略模式:准备一组算法,并将每一个算法封装到一个独立的类中。这些具体类具有共同的接口,从而使得它们可以相互转换。
3.模板方法:准备一个抽象类,将部分逻辑以具体方法以及具体构造子的方法实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。
4.观察者模式:又叫做发布-订阅模式。此模式定义一个一对多的依赖关系,让多个观察者同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者,使它们能够更新自己。
5.迭代子模式:迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象。
6.责任链模式:很多对象由每一个对象对其下家的引用而连接起来形成一条链。
7.命令模式:把一个请求或操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志。可以提供撤销或恢复功能。
8.备忘录模式:在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化存储起来,从而可以在合适的时候把这个对象还原到存储起来的状态。
9.状态模式:允许一个对象在其内部状态改变的时候改变其行为。
10.访问者模式:封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接收这个操作的数据结构则可以保持不变。
11.解释器模式:给定一个语言,解释器模式可以定义出其文本的表示方法,并同时提供一个解释器。
12.调停者模式:包装了一系列对象相互作用的方式,使得这些对象不必互相明显引用,从而实现松耦合。