设计模式专辑——概览

 

1.前言html

  写这个东西的目的,主要是为了本身能更好的掌握,而且灵活应用模式。其实你们在平时工做中有意无心的会用到不少模式,但并无仔细总结梳理,因此也是借此机会对以往开发设计作些总结、思考。java

  那么,因为设计模式的资料太多,解读各异,部分模式的解释很是模糊,使人费解。为了统一标准,这里参考维基百科做为基准。维基百科中已经对每一个模式都作了详细的说明,并且相关资料也很丰富,因此不会对每一个模式都进行展开。git

  文中参考维基百科将各个模式根据设计目的进行整理成表,以方便未来根据应用场景快速查找使用。github

  在学习和使用以前,最好能下载下面提供的例子,github上的这些例子写地很是好,很直观。先把例子跑起来运行下,可以更好的理解这些模式。不过,例子有时候也会误导咱们。一个例子为了能正常运行起来,不得不包含一个完整程序所须要的各个角色,这里面的部分角色其实并非该设计模式所关注的,这就致使了咱们对模式关注点的误解。因此理解的时候要注意一个模式的边界在哪里。一样的,类图并不能体现设计者的所有意图,也会带有误导性,尤为是特征相近的几个模式,单从类图上是看不出区别的。有的时候,简单的从模式的名字出发,站在抽象的高度去理解反而更简单些(名字不是随便取的,它包含了设计者和总结者的深度思考和理解)。算法

  另外这系列文章论述的概念比较抽象,须要阅读者有必定的开发设计经验,对各个模式有必定的了解,在阅读以前最好先过一遍各个模式。设计模式

2.相关资料微信

  维基百科:https://en.wikipedia.org/wiki/Software_design_pattern (维基对各个模式的梳理比较详细) app

  GoF设计模式:https://en.wikipedia.org/wiki/Design_Patterns (Gof【Gang of Four】指《设计模式》的四位做者,他们概括了最广为人知的23种设计模式)框架

  相关例子:https://github.com/iluwatar/java-design-patterns (这里有不少例子,能够直接拿来使用)函数

 

3.速查表

 

建立型模式
名称 目的  
抽象工厂(Abstract factory)
  • 提供一个接口,用于建立相关或从属对象的族,而不须要指定它们的具体类。经过选择具体的工厂,就选定了一族对象。
  • 它提供了多个工厂方法。
建造者 (Builder)
  • 经过同一个构建过程,建立不一样表现形式的复杂对象
  • 简化包含复杂构建逻辑的类
  • 具备统一的构建过程。
依赖注入 (Dependency Injection)
  • 类从注入器接受它须要的对象,而不是直接建立对象。
  • 主动传递依赖的对象给使用者,而不是让使用者去发现或建立依赖对象。
  • 经过配置决定依赖对象的建立
工厂方法 (Factory Method)
  • 定义用于建立单个对象的接口,但让子类决定要实例化哪一个类。工厂方法容许类将实例化推迟到子类
 
延迟初始化 (Lazy Initialization)
  • 延迟建立对象、计算值或其余一些昂贵过程的策略,直到第一次须要它为止。
  • 延迟初始化这种策略在不少地方都有应用,某些单例模式也会应用到延迟初始化。
多例 (Multition)
  •  确保类只有被命名的少数几个实例,并提供对它们的全局访问点。
  • 多例模式是单例模式的推广,对外提供了某个类的指定个数的实例。这些实例一般具备对应的名称,并使用Map进行维护。使用时经过名称获取对应实例。
对象池 (Object pool)
  • 经过回收再也不使用的物品来避免昂贵的资源获取和释放。能够认为是链接池和线程池模式的归纳。
  •  对象池很是常见,好比链接池、线程池。
原型 (Prototype)
  • 使用原型实例指定要建立的对象的类型,并从现有对象的“骨架”建立新对象,从而提升性能并将内存占用保持在最低水平
  • 一般在你须要使用到某个已经存在的对象,但又不但愿对外暴露它的状况下(一般是为了防止被修改),会使用原型模式对该对象进行拷贝,提供一个副本给外面使用。Java中实现原型模式须要实现Cloneable接口,这里须要区分浅复制和深复制。

单例 (Singleton)

  • 确保一个类只有一个实例,并提供对它的全局访问点
 
 结构型模式

适配器 (Adapter,Wrapper or Translator)

  • 将类的接口转换为客户机指望的其余接口。适配器容许类一块儿工做,不然因为接口不兼容而没法一块儿工做
 

桥接 (Bridge)

  • 将抽象从其实现中分离出来,从而容许二者独立变化
 
复合(Composite)
  • 将对象组合成树结构以表示部分总体层次结构。组合容许客户机统一处理单个对象和对象的组合
  • 树形结构
  • 部分和总体继承相同的接口
装饰器(Decorator)
  • 动态地将额外的职责附加到对象上,以保持相同的接口。为扩展功能提供了灵活的子类化替代方案
  • 经过构造函数将real object传入装饰器,装饰器在调用real object前或后添加逻辑
  • 装饰器和real object继承相同接口
外观 (Facade)
  • 为子系统中的一组接口提供统一的接口。Facade定义了一个更高级的接口,使子系统更容易使用
  •  将一个复杂系统封装到一个接口类中,调用者只看到这个接口类,使用该类便可完成复杂的系统调用
享元 (Flyweight)
  • 使用共享来支持大量类似的对象
 http://www.cnblogs.com/zhenyulu/articles/55793.html
标记(Marker)
  • 用于将元数据与类关联的空接口
  • 定义一个具备某种含义的接口,继承了该接口就带上了这种含义。经过判断是否继承这个接口来区别对待不一样对象。这个接口就是一种标记。
代理(Proxy)
  • 为另外一个对象提供代理项或占位符,以控制对它的访问
 
耦合(twin)
  • 在不支持多继承的语言中,作相似多继承的事
  • 经过引入实现了目标接口的对象来获取目标接口的功能
行为型模式
责任链(Chain of responsibility)
  • 经过给多个对象处理请求的机会,避免将请求的发送者与其接收者耦合。连接接收对象并沿链传递请求,直到对象处理它

  •  好比:过滤器
命令模式(Command)
  • 将请求封装为一个对象,从而容许对具备不一样请求的客户机进行参数化,以及对请求进行排队或记录。它还容许支持撤销操做
  • 封装请求
  • 按顺序记录历史请求
解释器模式(Interpreter)
  • 用于定义和解析表达式
 
中介者模式(Mediator)
  • 定义一个对象,它封装一组对象如何交互。中介器经过防止对象明确地相互引用来促进松耦合,并容许它们的交互独立变化
  • 中介中含有全部须要交互的对象的引用
  • 交互的对象之间不直接引用,而引用中介
备忘录(Memento)
  • 在不违反封装的状况下,捕获对象的内部状态并将其外部化,以便稍后将对象还原到此状态。
  • 把对象可变的状态用另外一个类封装起来(外部化),记录历史状态对象,以便恢复历史状态
空对象(Null object)
  • 经过提供一个默认对象来避免空指针
 
观察者(Observer or Publish/subscribe)
  • 定义对象之间的一对多依赖关系,其中一个对象中的状态更改会自动通知和更新其全部依赖项
 
雇工模式(Servant)
  • 提供通用的功能,一般称为工具类,通常没有实例,方法都是静态的
 
规约模式(Specification)
  • 以布尔方式从新组合业务逻辑

 
状态模式(State)
  • 容许对象在其内部状态更改时更改其行为。对象将显示为更改其类。
  • 抽象出状态类,里面包含状态对应的行为,把行为和状态绑定在一块儿
策略模式(Strategy)
  • 定义一组封装好的,互相可替换的算法,使算法和使用它的客户端之间互相独立
 
模板方法(Template Method)
  • 在操做中定义算法的框架,将一些步骤推迟到子类。模板方法容许子类在不改变算法结构的状况下从新定义算法的某些步骤。
  • 父类定义算法框架,抽象出步骤,控制好步骤执行顺序。子类实现具体步骤中的操做。
访问者(Visitor)
  • 表示要对对象结构的元素执行的操做。Visitor容许定义一个新的操做,而不更改其操做的元素的类。
  • Visitor中包含对全部元素的相应的操做,增长一个Visitor至关于增长一组操做。

 

 

 

喜欢的话能够打赏一下哦!!!

支付宝

微信

相关文章
相关标签/搜索