研究了一下,我为了方便理解,对它们进行了分类:
- 针对请求者与执行者关系方面
- 1对多 -
责任链模式
- 沿着这条链传递该请求,直到有一个对象处理它为止 - 多对多、多对一 -
中介者模式
- 中介者使各对象不需要显式地相互引用 - 一对一 -
命令模式
- 可用不同的请求对客户进行参数化
- 1对多 -
- 针对执行者
策略模式
- 使用不同的策略处理有不同的结果解释器模式
- 对请求语句进行解释状态模式
- 记录状态信息,状态的变更引起了行为的变更备忘录模式
- 保存记录信息/恢复记录信息迭代器模式
- 顺序访问的模板模式
- 预先定义好行为操作的模板
- 针对执行者的追加操作
访问者模式
- 某元素追加额外的操作,不影响原来的元素,不改变原来的行为操作下,也不改变元素结构情况下。观察者模式
- 观察执行者的执行动作的变化,并发送到多个观察者中。
1. 访问者模式
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
结构:访问者、追加额外元素、原本元素
个人笔记:
本来的执行操作是
visitor.handle(ObjectStruture);
但为了不改变原来执行操作,也不改变现有对象结构下
,进行追加操作,且保留了原来的结构。
做了如下修改:
元素类增加accept方法,并追加elementList
访问者增加visit方法,visit里添加 visitor.handle(ObjectStruture) ,保留原来的handle方法
元素类抽象化 - Element
追加的元素类:Element1、Element2
// 这是原本元素,追加了其他额外元素,通过add追加
public class ObjectStruture implements Element{
private List<Element> elementList = new ArrayList<>();
public void add(Element element){
elementList.add(element);
}
public void accept(Visitor visitor) {
for (Element element : elementList) {
element.accept(visitor);
}
visitor.visit(this);
}
}
// 访问者追加visit操作
public class Visitor {
void visit(Element element){
handle(element);
}
// 为了区分其他实现类不会追加,例如: element1.accept(new Visitor()) 不会进行追加操作。
void visit(Element1 element1){
System.out.println(element1.getClass().getName());
}
void handle(Element element){
System.out.println(element.getClass().getName());
}
}
public static void main(String[] args) {
ObjectStruture objectStruture = new ObjectStruture();
objectStruture.add(new Element1());
objectStruture.add(new Element2());
objectStruture.accept(new Visitor());
}
public interface Element {
void accept(Visitor visitor);
}
这是用于二次开发的
,用于对业务发生改变,请求参数变化,导致处理不适应原来的业务,所以这时就需要使用访问者模式,通过其他访问者,修正数据,以适应原来的业务操作。
2. 迭代器模式
提供一种方法顺序访问
一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
典型例子:JAVA 中的 iterator。
3. 观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
。
4. 模板模式
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
5. 状态模式
状态模式的定义:当一个对象的内在状态改变时,允许其改变行为,这个对象看起来像是改变了其类。状态模式的核心是封装,状态的变更引起了行为的变更
。
参考文章:https://blog.csdn.net/kris234seth/article/details/49684185
状态模式和状态是不同的概念,这个状态模式,行为会随着状态的改变而改变。
例如:1、画图工具的字体颜色,不同颜色写出来的字体颜色不同。2、连接请求,不同连接状态得到不同的结果。
特点
:状态可变,固定行为,结果随状态改变而改变。
结构方面有三个部分:抽象状态类(State)(包含状态和行为)、状态实现类、环境类(Context)(包含行为)
* 抽象状态类
* void setContext(Context context)
* void 行为()
* 状态实现类
* 环境类
* void setState(State state){state.setContext(this);this.state=state;}
* void 行为(){this.state.行为()}
//画图工具的字体颜色,不同颜色写出来的字体颜色不同。
Context context = new Context();
context.setColor(new RedColorState());
String result = context.write("字体颜色");// 输出: [red]字体颜色
System.out.println(result);
context.setColor(new GreenColorState());
String result2 = context.write("字体颜色");// 输出:[green]字体颜色
System.out.println(result2);
6. 备忘录模式
备忘录模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
这样以后就可将该对象恢复到原先保存的状态。
参考文章:https://blog.csdn.net/weixin_45433817/article/details/131501970
例如:1、游览器的前进和后退操作。2、ps里的历史操作痕迹
特点
:备忘录负责保存记录,负责人负责管理备忘录集合(包含保存备忘录和得到哪个备忘录),原发器负责创建备忘录,原发器就是原来事件本身
结构方面有三个部分:备忘录(Menento)、负责人(Caretaker)、原发者(Originator )
* 备忘录
* void setContent(String content)
* String getContent()
* 负责人
* void add(Menento menento)
* Menento get(int i)
* 原发者
* Menento createMenento()
* void recoveryFromMenento(Menento menento)
Originator originator = new Originator();//原发器,能创建备忘录
Caretaker caretaker = new Caretaker();//备忘录集合/负责人,负责看管备忘录
originator.setMessage("第一页"); // 操作痕迹
caretaker.add(originator.createMenento()); // 保存痕迹到备忘录
originator.setMessage("第二页"); // 操作痕迹
caretaker.add(originator.createMenento()); // 保存痕迹到备忘录
System.out.println("获取前一页记录:"+caretaker.get(-1)); // 获取前一个备忘录的痕迹 输出:获取前一页记录:Menento{source='第一页'}
//恢复备忘录
originator.recoveryFromMenento(caretaker.get(-1)); // 恢复前一个备忘录痕迹
System.out.println("恢复后:"+originator.getMessage());// 输出:恢复后:第一页
7. 策略模式
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换
。本模式使得算法可独立于使用它的客户而变化。
个人笔记:随着使用策略不同,返回不同结果
8. 解释器模式
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
。
9. 责任链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止
。
个人笔记
与命令模式不同的是:
责任链模式是,没有限制有多少实现。
命令模式是,一个请求只有一个实现。
public class FilterChain {
List<Filter> filters = new ArrayList<Filter>();
public void addFilter(Filter filter) {
filters.add(filter);
}
public void doChain(String msg){
//沿着这条链传递该请求,直到有一个对象处理它为止
for(Filter filter : filters){
boolean b = filter.doFilter(msg);
// 直到有一个对象处理它为止
if(b){
return;
}
}
}
}
10. 命令模式
将一个请求封装为一个对象,从而使你可用不同的请求
对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
个人笔记:
不同的请求执行不同的程序
与策略模式不同的是:
命令模式是不同的请求决定不同的结果
策略模式是不同的策略决定不同的结果
CommandProcessor processor = new CommandProcessor();
processor.add("ping",new CommandPing());
String result = processor.execute("ping 192.168.3.1");
System.out.println(result);
11. 中介者模式
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用
,从而使其耦合松散,而且可以独立地改变它们之间的交互。
个人笔记:
与责任链模式不同的是:
责任链模式是有多个执行对象。
中介者模式是只有一个执行对象,不需要关注请求对象与执行对象是否一致问题。
例子:聊天室