设计模式的简单总结

什么是模式?

模式是在 某种情景下对 某些问题的解决方案。
 
是不是一定用上模式的代码才是好代码?
不是,用 简单合适的方法解决问题。不要遇到什么问题都用必杀技,必杀技也需要酝酿的时间,如果可以一拳把对方秒杀的话,压根没必要用必杀技。
 
那什么时候才需要用设计模式?
设计模式不是刻意去运用的,而是遇到某个情景,触发到你的印象种的某些设计模式的条件,那么意味着用它们可以减少日后的维护成本,总的来时使用设计模式是一个很 自然的过程。
 

一 、创建型模式

  1.1单例模式
   设计原则:无
   介绍:在整个应用中只有一个对象
  1.2简单工厂

  常用场景:需要在一堆产品中选择其中一个产品
  介绍:通过工厂类去创建产品,调用者不用直接去创建对象,并封装了对象的创建细节。
  设计原则:遵循单一职责 、违背开闭原则(生成不同对象,需要实现不同的工厂类,扩展性不好)
 1.3工厂方法模式

 

   常用场景:一种场景是希望工厂与产品的种类对客户端保持透明,给客户端提供一致的操作,另外一种是不同的工厂和产品可以提供客户端不同的服务或功能
   介绍:工厂方法模式又叫虚拟构造子模式或者多态性共存模式,工厂模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中
   设计原则:单一指责,依赖倒置,开闭原则
 
 1.4抽象工厂
 

 

    常用场景:需要一个接口可以提供一个产品族,且不必知道产品的具体种类
    介绍: 工厂方法模式与抽象工厂模式最大的区别在于,在工厂方法模式中,工厂创造的是一个产品,而在抽象工厂模式中,工厂创造的是一个产品族。
    设计原则:单一指责,依赖倒置,开闭原则
1.5建造者模式

 


    常用场景:需要构建一批构建过程相同但表示不同的产品,而构建过程非常复杂
    介绍:建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
   设计原则: 遵循单一职责、开闭原则
1.6 原型模式
   常用场景:需要在运行时动态的创建指定实例种类的对象,或是需要复用其状态
   介绍:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象
   设计原则:无
二、结构模式
  2.1 代理模式
  常用场景:需要修改或屏蔽某一个或若干个类的部分功能,复用另外一部分功能,可使用静态代理,若是需要拦截一批类中的某些方法,在方法的前后插入一些一致的操作,假设这些类有一致的接口,可使用JDK的动态代理,否则可使用cglib
  介绍:代理模式给某一个对象提供一个代理对象,并由代理对象控制原有对象的引用
  设计原则:体现功能复用
 2.2适配器模式
 
   常用场景:需要使用一个类的功能,但是该类的接口不符合使用场合要求的接口,可使用定制适配器,又或者是有一个接口定义的行为过多,则可以定义一个缺省适配器,让子类选择性的覆盖适配器的方法
   介绍:把一个类的接口变换成客户端所期待的另一种结构,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作
   原则: 遵循开闭原则、体现功能复用
2.3装饰器模式

 


  常用场景:一个类需要动态的添加功能,且这些功能可以相互叠加
  介绍:装饰器模式又名包装模式,装饰器模式用以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案
  设计原则: 遵循迪米特、单一职责、开闭原则,破坏里氏替换,体现功能复用
2.4 桥接模式

 


 常用场景:一个对象有多个维度的变化,需要将这些维度抽离出来,让其独立变化
 介绍:业务抽象角色引用业务实现角色,或者说业务抽象角色的部分实现是由业务实现角色实现完成的。
 设计原则: 遵循单一职责、迪米特、开闭原则,体现功能复用
2.5 组合模式

   常用场景:当有一个结构可以组合成树形结构,且需要向客户端提供一致的操作接口,使得客户端操作忽略简单元素与复杂元素

   介绍:有时又叫做部分-整体模式。组合模式将对象组织到树结构中,可以用来描述整体与部分的关系。组合模式可以使客户端将单纯元素与复合元素同等看待
   设计原则: 遵循依赖倒置、开闭原则,破坏接口隔离
2.6 享元模式

 


   常用场景:一些状态相同的对象被大量的重复使用
   介绍:享元模式以共享方式高效的支持大量的细粒度对象
2.7 门面模式

 


  常用场景:一个子系统需要对外提供服务
  介绍:外部与子系统的通信(交互)必须通过统一的门面对象进行
  设计原则:遵循迪米特
三、行为型模式
 3.1 观察者模式
 

 

 常用场景:需要将观察者与被观察者解耦或者是观察者的种类不确定
 介绍:又叫发布订 阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察这对象,使它们能够自动更新自己
 设计原则:遵循迪米特、开闭原则
3.2 模板方法模式
 

 

 常用场景:一批子类的功能有可提取的公共算法骨架
 介绍:准备一个抽象类,将部分逻辑以抽象方法形式让子类去实现,不同哦能的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式的用意
 设计原则:破坏里氏替换,体现功能复用
3.3 命令模式

 

  常用场景:行为的请求者与行为的处理者耦合度过高 
介绍:命令模式把一个请求或在操作封装到一个对象中,命令模式允许系统使用不同的 请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能
  设计原则:遵循迪米特、开闭原则
3.4 状态模式

 

 常用场景:一个对象在多个状态下行为不同,且这些状态可互相转换
 介绍:状态模式允许一个对象在其内部状态改变的时候改变其行为,这个对象唉看上去就像是改变了它的类一样
 设计原则:遵循单一职责、依赖倒置、开闭原则
3.5责任链模式

 


 常用场景:一个请求的处理需要多个对象当中的一个或几个协作处理
 介绍:很多对象是由每一个对象对其下家的引用而连接起来形成一条链,请求在这个链上传递,直到链上的某一个对象囧丁处理此请求,发出这个请求的客户端并不知道链上的哪个对象最终处理了这个对象,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任
 设计原则:遵循迪米特
3.6 解释器模式

 

 常用场景:有一种语言被频繁的使用
  介绍:解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子
 设计原则:遵循单一职责
3.7中介者模式

 

 常用场景:一个系列的对象交互关系十分复杂
 介绍:中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用。从而使它们可以较松散地耦合
 设计原则:遵循迪米特,破坏单一职责
3.8 访问者模式
 

 

 常用场景:作用于一个数据结构之上的操作经常变
 介绍:访问者模式的目地是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变
 设计原则:遵循倾斜的开闭原则
3.9策略模式

 

 常用场景:算法或者策略需要经常替换
  介绍:其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换
 设计原则:遵循单一职责、依赖倒置、迪米特、开闭原则
3.10备忘录模式 

 


 常用场景:需要在对象的外部保存该对象的内部状态
 介绍:又叫快照模式,备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装性的条件下,将一个对象的状态捕捉,并外部化存储起来,从而可以在将来适合的时候把这个对象还原到存储起来的状态
 设计原则:遵循迪米特、开闭原则
3.11迭代器模式

 

 常用场景:需要迭代访问一个聚合对象中的各个元素,且不暴露该聚合对象内部的表示
 介绍:迭代器模式可以顺序的访问一个聚集中的元素而不必暴露聚集的内部表象
 设计原则:遵循迪米特
 
 
《Head First 设计模式》提到的设计模式
模式 描述
装饰者 包装一个类,提供新的行为。
状态 封装了基于状态的行为,并使用委托在行为之间切换。
迭代器 在对象的集合之中游走,而不暴露集合的实现。
外观 简化一群类的接口。
策略 封装可以互换的行为,并使用委托来决定要使用哪一个。
代理 包装对象,以控制对此对象的访问。
工厂方法 由子类决定要创建的具体类是哪一个。
适配器 封装对象,提供不同接口。
观察者 让对象能够在状态改变时被通知。
模板方法 由子类决定如何实现一个算法中的步骤。
组合 客户用一致的方式处理对象集合和单个对象。
单件 确保有且只有一个对象对象被创建。
抽象工厂 允许创建对象的家族,而无需制定他的具体类。
命令 封装请求成为对象。
 
OO基础

抽象
封装
多态
继承
 
OO原则

封装变化
多用组合,少用继承
针对接口编程,不针对实现编程
为交换对象之间的松耦合设计而努力
类应该对扩展开放,对修改关闭
依赖抽象,不依赖具体类
只和朋友交谈
别找我,我会找你
类应该只有一个改变的理由
 
个人观点: 整个设计模式的核心是为了以后更好的维护,所以设计原则 为   高内聚,低耦合 ,详细的原则,上文OO原则提到。
 
posted @ 2016-10-18 10:10  wxlevel  阅读(141)  评论(0)    收藏  举报