设计模式_20:责任链模式
来源:互联网 发布:淘宝现在禁止好评返现 编辑:程序博客网 时间:2024/06/18 11:18
书本的原句:
使多个对象都有几乎处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条连传递改请求,直到有一个对象处理它为止。
例子:一个员工请假或申请加薪需要先后通过小经理=》大经理=》最大的boss的审核,只有在最大boss审核通过后,申请才算生效:
public class Main { public static void main(String[] args) { Manager smallManager = new SmallManager("小经理"); Manager bigManager = new BigManager("大经理"); Manager boss = new Boss("最大的Boss"); //设置上级 smallManager.setManager(bigManager); bigManager.setManager(boss); Request request_1 = new Request("请假", 10); Request request_2 = new Request("请假", 2); smallManager.doCheck(request_1); System.out.println("---------------------"); smallManager.doCheck(request_2); System.out.println("---------------------"); Request request_3 = new Request("加薪", 100); Request request_4 = new Request("加薪", 10000); smallManager.doCheck(request_3); System.out.println("---------------------"); smallManager.doCheck(request_4); }}class Request { private String type; private int value; public Request(String type, int value) { this.type = type; this.value = value; } public String getType() { return type; } public int getValue() { return value; }}abstract class Manager { protected String name; protected Manager manager; public Manager(String name) { this.name = name; } public void setManager(Manager manager) { this.manager = manager; } abstract void doCheck(Request request);}class SmallManager extends Manager{ public SmallManager(String name) { super(name); } @Override void doCheck(Request request) { if ( "请假".equals(request.getType()) && request.getValue() > 5 ){ System.out.println(name + ":请假不能超过5天"); return; } System.out.println("类型:"+request.getType()+",数值:"+request.getValue()+","+name+"审核通过了"); if (null != manager) manager.doCheck(request); }}class BigManager extends Manager{ public BigManager(String name) { super(name); } @Override void doCheck(Request request) { if ( "请假".equals(request.getType()) && request.getValue() > 3 ){ System.out.println(name + ":请假不能超过3天"); return; } System.out.println("类型:"+request.getType()+",数值:"+request.getValue()+","+name+"审核通过了"); if (null != manager) manager.doCheck(request); }}class Boss extends Manager{ public Boss(String name) { super(name); } @Override void doCheck(Request request) { if ( "请假".equals(request.getType()) && request.getValue() > 2 ){ System.out.println(name + ":请假不能超过2天"); return; } else if ( "加薪".equals(request.getType()) && request.getValue() > 1000){ System.out.println(name + ":加薪1000块以上太高了,以后再说"); return; } System.out.println("类型:"+request.getType()+",数值:"+request.getValue()+","+name+"审核通过了"); if (null != manager) manager.doCheck(request); }}
小经理:请假不能超过5天---------------------类型:请假,数值:2,小经理审核通过了类型:请假,数值:2,大经理审核通过了类型:请假,数值:2,最大的Boss审核通过了---------------------类型:加薪,数值:100,小经理审核通过了类型:加薪,数值:100,大经理审核通过了类型:加薪,数值:100,最大的Boss审核通过了---------------------类型:加薪,数值:10000,小经理审核通过了类型:加薪,数值:10000,大经理审核通过了最大的Boss:加薪1000块以上太高了,以后再说
我们当然可以把审核的步骤写在同一个方法里,但这样的话,这个方法承担的责任就很大了,任何步骤修改、增加都必须修改此方法,不符合单一职责原则和开闭原则。
并且,有个更灵活的地方是,请求可以通过任意一个对象传入,比如上面的请假和加薪,员工完全可以直接向最大的boss请求,也就是这样写:
boss.doCheck(request_1);
不过注意的是,在链的末端之前必须要正确处理请求
阅读全文
1 0
- 设计模式_20:责任链模式
- 备忘录模式(设计模式_20)
- 责任链设计模式
- 责任链设计模式
- 设计模式---责任链
- 责任链设计模式
- 设计模式----责任链
- 设计模式-责任链
- 责任链设计模式
- 责任链设计模式
- 设计模式:责任链
- [设计]责任链模式
- 设计模式--责任链
- 责任链设计模式
- 设计模式----责任链模式
- 【设计模式】责任链模式
- 设计模式---责任链模式
- 设计模式:责任链模式
- 面试准备汇总
- 【Java作业】2017.10.14/10.15
- appium的一些常用且重要的命令
- UIViewContentMode 图片显示模式(iOS)
- C++数学计算库与软件
- 设计模式_20:责任链模式
- tomcat简单实现(how tomcat work第一章内容)
- js和css样式遇到的小问题
- SQL语句中:UNION与UNION ALL的区别
- 【SQL】oracle 一条语句更新两行,decode函数交换两行数据,实例教程
- Vaadin Docs
- 开车旅行(drive)
- oracle的常用函数 instr() 和sign()函数
- 拖拽插件使用说明