Java学习——设计模式——行为型模式1

行为型模式

行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,涉及算法与对象间职责的分配。


行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分配行为,后者采用组合或聚合在对象间分配行为。由于组合或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。

包括:
1、模板方法
2、策略模式
3、命令模式
4、职责链模式
5、状态模式
6、观察者模式
7、中介者模式
8、迭代器模式
9、访问者模式
10、备忘录模式
11、解释器模式

除了模板方法和解释器模式是类行为型模式,其余都是对象行为型模式

模板方法

定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。

结构
1、抽象类:给出算法轮廓和骨架

  • 模板方法:定义算法骨架,按顺序调用包含的基本方法
  • 基本方法:实现算法各个步骤的方法,是模板方法的组成部分。
    • 抽象方法:由抽象类声明、由其具体子类实现
    • 具体方法:由一个抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承
    • 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种

2、 具体子类:实现抽象类中所定义的抽象方法和钩子方法,是一个顶级逻辑的组成步骤
在这里插入图片描述
优点

  • 提高代码复用性
  • 实现反向控制
    通过一个父类调用子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制,并符合“开闭原则”

缺点

  • 对每个不同实现都需要定义一个子类,导致类的个数增加,系统更加庞大,设计也更加抽象
  • 父类中的抽象方法由子类实现,子类的执行结果会影响父类的结果,这导致一种反向的控制结构,提高了代码阅读的难度

策略模式

定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的用户。
属于对象行为模式,通过堆算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象堆这些算法进行管理。

结构
1、抽象策略类
2、具体策略类
3、环境类

在这里插入图片描述
优点
1、策略类之间可以自由切换
2、易于扩展。增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码
3、避免使用多重条件选择语句

缺点:
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类
2、策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量

命令模式

将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分隔开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。

结构
1、抽象命令类
2、具体命令类
3、实现者/接收者
4、调用者/请求者

在这里插入图片描述
优点
1、降低系统耦合度,命令模式能将调用操作的对象与实现该操作的对象解耦
2、增加或删除操作非常方便。
3、可以实现宏命令。
4、方便实现undo和redo操作。

缺点:
1、可能会导致某些系统有过多的具体命令类
2、系统结构更加复杂

责任链模式

又叫职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

结构
1、抽象处理者
2、具体处理者
3、客户类

在这里插入图片描述

优点
在这里插入图片描述

缺点:

在这里插入图片描述

开始摆烂,学到这里好混乱,感觉学每一种好像懂了,但跟其他的区别又说不上来,又感觉每种模式差不多。。。。。。唉。。。。。。