您的位置:首页 > 其它

设计模式之责任链模式

2015-12-05 16:48 357 查看

一、定义
使多个对象都有接受请求的机会,而只有符合自己条件的对象才能处理这个请求。

二、实例
2.1 实例:
有一个公司X,每一个员工都有向公司借钱的机会,但是根据数目的不同需要的审批人也不同,比如1000到5000是等级1,只需要
研发组的小组长同意就行了,但是5000到10000是等级2,需要经理同意,1万以上就需要总经理同意了。而且每次借钱你只能向研发组组长提出要求,然后由组长去处理。这时候就用到了责任链模式。
首先需要一个类封装人们的请求,Message类就诞生了。
public class Message {
private int type ;
private String message ;

public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}

}
需要一个基础的处理类,因为不管组长还是经理,他们处理请求的逻辑都是一样的,首先看是不是自己能处理的,能就处理,不能就交给下一个人。
public abstract class BaseRseponse {
static int TYPE_TYPE1 = 1;
static int TYPE_TYPE2 = 2;
static int TYPE_TYPE3 = 3;

private int type ;
private BaseRseponse next = null ;
public BaseRseponse(int type) {
this.type = type ;
}
public abstract void action(Message message);

public final void handler(Message message) {
if(message.getType() == this.type){
action(message);
}else if(this.next != null){
this.next.handler(message);
}else {
System.out.println("到达责任链末尾!");
}
}

public void setNext(BaseRseponse next) {
this.next = next;
}
}
然后完成组长、经理、总经理的角色定义

// 组长
public class Response1 extends BaseRseponse{

public Response1(int type) {
super(type);
}
public Response1() {
super(TYPE_TYPE1);
}
@Override
public void action(Message message) {
System.out.println("由第一责任人处理信息:"+message.getMessage());
}

}
//小经理
public class Response2 extends BaseRseponse{

public Response2(int type) {
super(type);
}

public Response2() {
super(TYPE_TYPE2);
}

@Override
public void action(Message message) {
System.out.println("由第二责任人处理信息:"+message.getMessage());
}

}
//大经理
public class Response3 extends BaseRseponse{
public Response3(int type) {
super(type);
}

public Response3() {
super(TYPE_TYPE3);
}

@Override
public void action(Message message) {
System.out.println("由第三责任人处理信息:"+message.getMessage());
}
}
测试代码:

Response1 teamleader = new Response1();
Response2 smallmanager = new Response2();
Response3 bigmanager = new Response3();
teamleader.setNext(smallmanager);
smallmanager.setNext(bigmanager);

Message message1 = new Message();
message1.setType(1);
message1.setMessage("等级为1的事务");
teamleader.handler(message1);

Message message2 = new Message();
message2.setType(2);
message2.setMessage("等级为2的事务");
teamleader.handler(message2);

Message message3 = new Message();
message3.setType(3);
message3.setMessage("等级为3的事务");
teamleader.handler(message3);

Message message4 = new Message();
message4.setType(4);
message4.setMessage("等级为4的事务");
teamleader.handler(message4);
运行结果为:

由第一责任人处理信息:等级为1的事务
由第二责任人处理信息:等级为2的事务
由第三责任人处理信息:等级为3的事务
到达责任链末尾!
2.2 修改
你看一下测试代码,是不是发现很麻烦,而且有一个很大的问题,我可以直接将message交给小经理或者大经理,
这怎么可以呢!所以最好还要加一层封装,设计一个类,我只要把请求给这个类就行了,而我不知道请求具体的提交过程。
public class Submiter {

private Response1 teamleader = new Response1();
private Response2 smallmanager = new Response2();
private Response3 bigmanager = new Response3();

public Submiter() {
teamleader.setNext(smallmanager);
smallmanager.setNext(bigmanager);
}
public void submitMessage(Message message) {
teamleader.handler(message);
}

}
测试代码:

Submiter submiter = new Submiter();
submiter.submitMessage(message1);
submiter.submitMessage(message2);
submiter.submitMessage(message3);
submiter.submitMessage(message4);
运行结果没变:

由第一责任人处理信息:等级为1的事务
由第二责任人处理信息:等级为2的事务
由第三责任人处理信息:等级为3的事务
到达责任链末尾
三、缺点
从上面的例子中我们看到,每一个请求的执行都需要经过很多很多的执行者,也就是说这条责任链很有可能会
非常的长,这样对于程序的执行效率就不高了,所以使用的时候一定要注意。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: