行为型模式的设计模式笔记

此笔记是在软件秘笈-设计模式那点事上做的笔记

一.责任链模式

1.设计思路

类似于学生请假,先写假条给班长,班长看是否能处理,不能处理在找班主任,班主任解决不了在找校长,最后审批,一个请假流程就算完成了。

行为型模式的设计模式笔记

责任链模式是一种对象的行为模式。在责任链模式中,很多对象由每一个对象对其下家的引用而连接起来形成一条链。客户端应用请求在这条链上进行传递,直到链上的某一个对象决定处理此请求,发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使系统可以在不影响客户端的情况下动态的重新组织链和分配责任。

涉及角色如下

(1)抽象处理者角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回下家的引用。这个角色通常由一个java抽象类或java接口实现。

(2)具体处理者角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求创给下家。由于处理者持有下家引用,因此如果需要,具体处理者可以访问下家。

例子中举的请假模式,设计图可以如下

行为型模式的设计模式笔记

责任链代码demo

public abstract class AbstractHandler implements IHandler{

//下一个处理者

private IHandler handler;

//请假级别

private int state = -1;

//构造方法,设置界别

public AbstractHandler(int state){

this.state=state;

}

//处理请求,交由子类负责进行具体的处理

public abstract void process(IStudent student);

//处理请求

public void handlerRequest(IStudent student){

//如果学生对象存在

if(student != null){

if(this.state == student.getState()){

//如果请假级别一致,则处理

this.process(student);

}else{

if(this.handler != null){

//处理不了,交由下一个处理者

this.handler.handlerRequest(student);

}

}

}

//设置下一个处理者

public void setHandler(IHandler handler){

this.handler = handler;

}

}

班长处理者

public class SquadLeaderHandler extends AbstractHandler{

public SquadLeaderHandler(){

super(0);//根据上面的抽象类,每高一级变添加多一级,教室就是super(1)

}

//子类具体处理

@Override

public void process(IStudent student){

System.out.println("处理完成");

}

}

根据层层向上,最后处理完整个请求,例:

private ProcessHandler(){

//创建处理对象

//班长

this.sqmshandler = new SquadLeaderHandler();

//老师

this.techHandler = new TeacherHandler();

//校长

this.scmshandler = new SchoolMasterHandler();

//建立责任链

this.sqmshandler.setHandler(this.techhandler);

this.techhandler.setHandler(this.scmshander);

}

2.设计原则

(1)开闭原则

责任链中的开闭原则体现在动态的扩展责任链中的处理节点,而无须更改客户端应用,充分体现了开闭原则的设计思想。

(2)单一职责原则

开闭原则的应用使得责任链中每个消息处理者都能专注于自身的行为,消息处理者只完成各自的本职工作,每个类的功能单一,我们就可以异步定位问题所在。节省了代码走查时间。

3.使用场合

(1)有多个对象处理同一个请求,具体由哪一个处理还不确定,只有在运行时才能确定哪一个对象处理的情况

(2)消息具有多个接受者,而接收对象又是不明确的情况,只需要向其中一个对象发出消息,由其内部具体处理

(3)同一个消息的多个处理对象可能会动态增加或减少,需要动态的指定的情况。

4.jdk中的使用

java.lang.ClassLoader。在其抽象类中,存在一个指向父类的指针parent,在构造方法中传入父类对象引用,在loadClass方法中就体现了责任链的处理过程。

行为型模式的设计模式笔记

扩展:

(1)外观模式:在设置责任链中的链条时,可能会用到外观模式,让客户端应用只与外观打交道

(2)组合模式:责任链模式也是一种树形结构,只不过它只有一条主干而已,没有其他分支,因此可以说在责任链中应用了组合模式配置链条

(3)命令模式:责任链模式中涉及了请求传递的行为,请求的传递用到了命令模式

(4)观察者模式:在涉及请求传递的模式中,还有一个就是观察者模式,但其中是有不同的。观察者模式中,消息传递时可以有多个接受者同时接收,而责任链模式只有一个接收者接收消息并传递;其次,两个模式的职责是不同的,观察者模式主要是事件触发,将消息发送出去,是一种广播的形式,而责任链模式则是按照既定规则进行一系列的消息处理。

 

待添加ing~