模板模式:
模板方法抽取公共方法,享元模式抽取公共属性用工厂进行制作
image.png

策略模式:定义了一组算法,将每个算法封装起来,并且使他们之间可以互换
image.png
Context是上下文,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用;Strategy是策略类,用于定义所有支持算法的公共接口;ConcreteStrategy是具体策略类,封装了具体的算法或行为,继承与Strategy
image.pngimage.pngimage.png

3、优点

1、可以减少ifelse语句
2、提高算法的保密性和安全性
3、符合开闭原则

4、缺点

1、客户端需要知道所有策略类,自己决定使用哪个策略类
2、类的数量增加

命令模式:
请求以命令的形式包裹在对象中,并传给调用对象,调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
命令模式是将行为请求者和行为实现者解耦合的方式。对命令进行封装,将命令和执行命令分隔开,请求的一方发出命令,要求执行某些操作,接收一方收到命令,执行这些操作的真正实现。
image.png
image.png
image.png
image.pngimage.png
Runable是一个典型命令模式,Runnable担当命令的角色,Thread充当的是调用者,start方法就是其执行方法
优点:降低系统的耦合度。新的命令可以很容易地加入到系统中。可以比较容易地设计一个命令队列和宏命令。可以方便地实现对请求的Undo和Redo。
缺点:使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。

职责链模式:
image.png
image.pngimage.pngimage.png
责任链设计模式重点:
客户端不知道链的哪个部分将处理请求,它将把请求发送到链中的第一个对象,例如,在我们的程序中,ATMDispenseChain不知道谁在处理分配输入金额的请求
链中的每个对象都有自己的实现来处理请求,全部或部分或将其发送到链中的下一个对象
链中的每一个对象都应该引用链中的下一个对象来转发请求

JDK中的责任链模式示例#

  • java.util.logging.Logger#log()
  • javax.servlet.Filter#doFilter()

状态模式:
意图:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类
image.png

观察者模式:
定义:它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
image.png
image.pngimage.pngimage.pngimage.png
优点:解除耦合,让耦合的双方都依赖于抽象,从而使得各自的变换都不会影响另一方
缺点:在应用观察者模式时需要考虑一下开发效率和运行效率的问题,程序中包括一个被观察者、多个观察者,开发、调试等内容会比较复杂,而且在Java中消息的通知一般是顺序执行,那么一个观察者卡顿,会影响整体的执行效率,在这种情况下,一般会采用异步实现。

中介者模式:
意图:用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互调用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
image.png

使用场景:
1、系统中对象间存在较为复杂引用,导致依赖关系和结构混乱而无法复用的情况。
2、想通过一个中间类来封装多个类的行为,但是又不想要太多的子类。
优点:
1、松散耦合、将多个对象之间的联系紧耦合封装到中介对象中,做到松耦合。不会导致一动牵全身。
2、将多个对象之间的交互联系集中在中介对象中。发送变化仅需修改中介对象即可、提供系统的灵活性、使同事对象独立而易于复用。
3、符合迪米特原则。就是说一个对象应当对其他对象有尽可能少的了解。减少各个对象之间的了解。
缺点:
1、如果各个同事间的交互非常多并且复杂情况下,都交给中介者会导致中介者变得十分复杂,不易维护和管理。

迭代器模式:
image.png
迭代器模式与结构型模式中的组合模式有些许类似,组合模式只需要通过List集合进行遍历即可,但是迭代器模式是定义具体行为,需要自定义数组与迭代器。
image.png
image.png
image.png
image.png
最核心的是两个对象,一个是书架这样的一个书的集合books[],代表了需要遍历的元素;另一个就是迭代器,好像一个工具,用到的时候将this对象代指的书架集合放里面,进行遍历,不需要的时候束之高阁。同时为什么会有接口呢,其实接口的作用是为了降低耦合度,在main函数中,我们使用的是Iterator这个接口来定义的引用,而不是BookShelfIterator,这样做的好处是完全屏蔽了内部的细节,在用户使用的时候,完全不知道BookShelfIterator的存在。

访问者模式:
image.png
做出访问者和基本元素的抽象接口,实现其子类的基本特性,在定义一个基本元素集合类,用于存储被访问的元素,同时提供对访问者的调用
image.png
image.png
image.pngimage.pngimage.pngimage.pngimage.pngimage.png
如果一个对象结构比较复杂,同时结构稳定不易变化,但却需要经常在此结构上定义新的操作,那就非常合适使用访问者模式,比如复杂的集合对象、XML文档解析、编译器的设计等。
访问者模式使我们更加容易的增加访问操作,但增加元素比较困难,需要我们修改抽象访问类和所有的具体访问类。

备忘录模式:
定义:不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态,该模式又叫快照模式。
优点:提供了一种可以恢复状态的机制,当用户需要时能够比较方便地将数据恢复到某个历史状态。
实现了内部状态的封装,除了创建它的发起人之外,其他对象都不能访问这些状态信息
简化了发起人类,发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,符合单一职责原则。
缺点:资源消耗大,如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。
image.png
采用一个外部类具有需要保存状态类的基本属性即可,同时在被保存的类中有获取备忘录的对应属性的方法。

解释器模式:
自定义规则对语言进行解释,例如翻译,计算器等
使用频率较低