在阅读其余源码的时候被好多设计模式卡主了,所以想的简单的学习一下设计模式。前端
参考: <<大话设计模式>>与<<Java与模式>>。算法
设计模式(Design pattern)表明了最佳的实践,一般被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程当中面临的通常问题的解决方案。这些解决方案是众多软件开发人员通过至关长的一段时间的试验和错误总结出来的。
设计模式是一套被反复使用的、多数人知晓的、通过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石同样。项目中合理地运用设计模式能够完美地解决不少问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在咱们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被普遍应用的缘由。编程
能够分为三大类:建立型模式(Creational Patterns)-5种、结构型模式(Structural Patterns)-7种、行为型模式(Behavioral Patterns)-11种。另外还有另外一类设计模式:J2EE 设计模式。设计模式
序号 | 模式 & 描述 | 包括 |
---|---|---|
1 | 建立型模式 这些设计模式提供了一种在建立对象的同时隐藏建立逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例须要建立哪些对象时更加灵活。 |
|
2 | 结构型模式 这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象得到新功能的方式。 |
|
3 | 行为型模式 这些设计模式特别关注对象之间的通讯。 |
|
4 | J2EE 模式 这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。 |
|
一、开闭原则(Open Close Principle)数据结构
开闭原则的意思是:对扩展开放,对修改关闭。在程序须要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,咱们须要使用接口和抽象类,后面的具体设计中咱们会提到这点。架构
二、里氏代换原则(Liskov Substitution Principle)学习
里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类能够出现的地方,子类必定能够出现。LSP 是继承复用的基石,只有当派生类能够替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也可以在基类的基础上增长新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,因此里氏代换原则是对实现抽象化的具体步骤的规范。ui
三、依赖倒转原则(Dependence Inversion Principle)spa
这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。设计
四、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另一个意思是:下降类之间的耦合度。因而可知,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调下降依赖,下降耦合。
五、迪米特法则,又称最少知道原则(Demeter Principle)
最少知道原则是指:一个实体应当尽可能少地与其余实体之间发生相互做用,使得系统功能模块相对独立。
六、合成复用原则(Composite Reuse Principle)
合成复用原则是指:尽可能使用合成/聚合的方式,而不是使用继承。
7. 单一职责原则
指在类层面,方法层面,接口层面的职能都是单一的。更准确的解释是:就一个类而言,应该仅有一个引发它变化的缘由。
建立型:对类的实例化过程的抽象。(官方语言是五种:工厂、抽象工厂、单例、建造者、原型)
分为类的建立模式和对象的建立模式两种:
类的建立模式:使用继承关系,把类的建立延迟到子类中,从而封装了客户端将获得哪些具体类的信息,而且隐藏了这些类的实例是如何被建立和放在一块儿的。
对象的建立模式:把对象的建立过程动态地委派给另外一个对象。
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.调停者模式:包装了一系列对象相互做用的方式,使得这些对象没必要互相明显引用,从而实现松耦合。