行为型模式(Behavioral Pattern)
- 职责链模式(Chain of Responsibility)
- 多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止
- 典型应用:servlet filter
- 命令模式(Command)
- 解释器模式(Interpreter)
- 解释器模式是类的行为模式。
- 给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。
- 客户端可以使用这个解释器来解释这个语句中的句子。
- 典型应用:解析四则混合运算,解析xml文档
- 迭代器模式(Iterator)
- 提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示
- 典型应用: Java中的Iterator
- 中介者模式(Mediator)
- 中介者模式又称为调停者模式,它是一种对象行为型模式。
- 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
- 典型应用:多人聊天室,MVC架构(controller是中介者),GUI开发中多界面的引用和控制
- 四个角色:(同事类方法中传入中介者对象)
- Mediator: 抽象中介者
- ConcreteMediator: 具体中介者
- Colleague: 抽象同事类
- ConcreteColleague: 具体同事类
- 备忘录模式(Memento)
- 备忘录对象是一个用来存储另外一个对象内部状态的快照(snapshot)的对象。
- 备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在将来适合的时候把这个对象还原到存储起来的状态。
- 典型应用:
- 0、Session和Cookie的使用都是备忘录模式。
- 1、后悔药。
- 2、打游戏时的存档。
- 3、Windows 里的 ctrl + z。
- 4、IE 中的后退。
- 5、数据库的事务管理。
- 观察者模式(Observer)
- 四个角色:(观察者持有目标对象,并在初始化时向目标注册自己。目标发生变化时,通知观察者)
- Subject: 目标
- ConcreteSubject: 具体目标
- Observer: 观察者
- ConcreteObserver: 具体观察者
- Java自带接口:Observable, Observer
- vs中介者模式:
- 中介者(mediator)强调的是同事(colleague)类之间的交互
- 而观察者(observer)中的目标类(subject)强调是目标改变后对观察者进行统一的通讯
- 状态模式(State)
- 策略模式(Strategy)
- 定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。
- 策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。
- 策略模式是一种对象行为型模式。
- vs状态模式:
- 策略模式将具体策略类暴露出去,调用者需要具体明白每个策略的不同之处以便正确使用。
- 而状态模式状态的改变是由其内部条件来改变的,与外界无关
- 状态对象是环境类的一个成员变量,策略对象是环境类的一个方法参数
- 三个角色:
- Context: 环境类
- Strategy: 抽象策略类
- ConcreteStrategy: 具体策略类
- 模板方法模式(Template Method)
- 一个抽象类公开定义了执行它的方法的方式/模板,其子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行
- 典型实例:servlet中service() doGet() doPost() 方法
- 访问者模式(Visitor)
- 五个角色:
- 抽象访问者:为对象结构中的每一个具体元素类声明一个访问操作。
- 具体访问者:实现对每一具体元素的访问方法。
- 抽象元素:声明accept方法,接收访问者的访问操作,通常是抽象类和接口。
- 具体元素:实现accept方法,调用访问者的对应的访问方法。
- 对象结构:存放元素对象并提供遍历方法,可以使用组合模式实现
- 一种将数据操作与数据结构分离的设计模式
- 类似Java重载,不同的方法入参就是不同的方法实现
interface Visitor {
void visit(Games games);
void visit(Photos photos);
}
interface Computer {
void accept(Visitor visitor);
}
class ZhangSan implements Visitor {
public void visit(Games games) {
games.play();
}
public void visit(Photos photos) {
photos.watch();
}
}
class LiSi implements Visitor {
public void visit(Games games) {
games.play();
}
public void visit(Photos photos) {
photos.watch();
}
}
class Games implements Computer {
public void accept(Visitor visitor) {
visitor.visit(this);
}
public void play() {
System.out.println("play lol");
}
}
class Photos implements Computer {
public void accept(Visitor visitor) {
visitor.visit(this);
}
public void watch() {
System.out.println("watch scenery photo");
}
}
class ObjectStructure {
private List<Computer> computers = new ArrayList<Computer>();
public void action(Visitor visitor) {
computers.forEach(c -> {
c.accept(visitor);
});
}
public void add(Computer computer) {
computers.add(computer);
}
public static void main(String[] args) {
ObjectStructure os = new ObjectStructure();
os.add(new Games());
os.add(new Photos());
// 创建一个访问者
Visitor visitor = new ZhangSan();
os.action(visitor);
}
}
来源:https://www.cnblogs.com/kintanx/p/11444399.html