行为型模式
关注系统中对象之间的交互,研究系统在运行时对象之间的通信与协作,进一步明确对象的职责。行为型模式分为类行为型模式和对象行为型模式。
- 类行为型模式使用继承关系对类分配行为,使用多态等方式分配父类子类的职责。
- 对象行为型模式使用对象关联关系分配行为,职责。
由于合成复用原则,尽量使用关联关系。 行为型模式有:
- 职责链模式
- 命令模式
- 解释器模式
- 迭代器模式
- 中介者模式
- 备忘录模式
- 观察者模式
- 状态模式
- 策略模式
- 模板方法模式
- 访问者模式
职责链模式
概述
比如大学奖学金申请环节需要多人审批,先是辅导员审批,然后交由系主任签字,接着是院长审批,最后是校长审批。学生提交申请表可看做一个请求,不同的审批者处理该请求,除了辅导员学生不需要一一进行交互。那么辅导员,系主任,院长,校长处理申请书就构成一个职责链。职责链可以是直线、环和树形结构。直线结构最常见。
定义:
避免将一个请求的发送者和接受者耦合在一起,让更多对象都有机会处理请求。将接受请求的对象连接成一个链,沿着这条链传递请求,直到有对象能够处理。
结构
Handler类是抽象处理者:定义了抽象请求接口。由于不同处理者处理请求方式不同,定义一个抽象请求处理方法(handlerRequest()方法),处理者将请求交个下一个处理者,所以定义一个==抽象处理类对象(successor)==作为下一个处理者的引用。通过该引用即可将处理者们连接成一个链。
ConcreteHandler具体处理类:抽象处理类的子类,实现抽象处理类定义的抽象请求处理方法,在处理请求之前先判断是否具有响应的处理权限,没有权限就交由后继的处理者,有就进行处理。
抽象处理类:抽象类中,对下一个处理对象的引用访问控制权限为protected,表示只有在子类使用。
public abstract class Handler{
protected Handler successor;
public void setSuccessor(Handler successor){
this.successor = successor;
}
public abstract void handlerRequest(String request);
}
具体请求类实现代码:
public class ConcreteHandler extends Handler{
public void handlerRequest(String request){
if(具有权限){
//处理请求
}else{
this.successor.handlerRequest(request);//将请求转发至下一个请求处理者
}
}
}
客户端代码部分如下:
……
Handler handler1,handler2,handler3;
handler1 = new ConcreteHandlerA();
handler2 = new ConcreteHandlerB();
handler3 = new ConcreteHandlerC();
handler1.setSuccessor(handler2);
handler2.setSuccessor(handler3);
handler1.handlerRequest("请求对象");
……
注意:职责链并不负责创建职责链,由系统的其他部分完成,一般客户端完成该工作。
纯与不纯的职责链模式
纯的职责链模式:要求一个具体的请求处理对象要么承担全部责任,要么将责任推给下一个请求处理对象,不允许请求处理对象只承担一部分责任。要求一个请求必须被某一个请求处理对象接收,不能出现某个请求没有被任何对象处理。
不纯的职责链模式:允许某个请求被某个具体请求处理对象部分处理好向下一个请求处理对象传递,而且可以最终不被任何对象处理接收。
优点:
- 使得一个对象无须知道其他哪一个对象处理其请求,对象仅需知道该请求会被处理即可,发送和接收方没有对方的明确信息,并且链中的对象不需要知道链的结构,降低了系统的耦合度。
- 请求处理对象只需要维持一个指向下一个请求处理对象的引用,不需要维持所有的处理者,简化对象之间的连接。
- 给对象分配职责更加灵活,可以动态的对职责链进行增加修改或者改变一个对象的职责。
- 在系统中增加新的请求处理对象无须修改原有的系统代码,符合开闭原则。
缺点:
- 没有一个明确的请求接收对象,不能保证请求一定会被处理,也可能因为职责链创建不合理而得不到处理。
- 较长的职责链,请求的处理涉及多个请求处理对象,系统性能会受到影响。
- 创建职责链不当可能造成循环调用,导致系统陷入死循环。