设计模式之责任链模式
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的事务 到达责任链末尾! |
你看一下测试代码,是不是发现很麻烦,而且有一个很大的问题,我可以直接将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的事务 到达责任链末尾 |
从上面的例子中我们看到,每一个请求的执行都需要经过很多很多的执行者,也就是说这条责任链很有可能会
非常的长,这样对于程序的执行效率就不高了,所以使用的时候一定要注意。
相关文章推荐
- ceph rgw中的md_config_obs_t类
- 营业税
- 转:为什么要有handler机制?
- 布尔值
- kafka官方Quick Start
- MySQL重要但容易被忽略_MySQL自定义函数&存储过程
- 二叉树的非递归遍历
- SaltStack入门(二)Grains、NoteGroup和State
- 三大分布
- #读书笔记#温伯格技术思想三部曲:颠覆完美软件(1)
- virtual析构函数
- PING通,无法打开网站
- OC-10.类的扩展
- PHP识别但是不识别
- commons-fileupload 核心API 分析
- MAVEN向本地仓库导入jar包
- CPU调度与死锁
- 数列中不含1,将含有1的数字全部去掉(管理员不喜欢1,1排序问题)
- 如何解决SQL Server 2014 无法连接到(local)
- 事务