设计模式-第21章(职责链模式)
创始人
2025-06-01 05:07:07
0

职责链模式

  • 职责链模式
  • 职责链的好处
  • 职责链应用

职责链模式

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

发出请求的客户端并不知道哪一个对象最终处理这个请求,这样系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任。

在这里插入图片描述
Handler 处理请求的接口。
ConcreteHandler1,ConreteHandler2,具体的请求处理类,处理它所负责的请求,可以访问它的后继者,如果不能处理,就将请求转发给后继者。

Handler

abstract class Handler{// 后继者,如果不能处理当前请求,则转发到后继者进行处理protected Handler successor;// 设置继任者public void setSuccessor(Handler successor){this.successor = successor;}public abstract void handleRequest(int request);
}

ConcreteHandler

class ConcreteHandler1 extends Handler{public void handleRequest(int request){if (request >=0 && request < 10){System.out.println(this.getClass().getSimpleName()+" 处理请求 "+request);}else if (successor != null){// 处理不了当前请求,后继者进行处理successor.handleRequest(request);}}
}
class ConcreteHandler2 extends Handler{public void handleRequest(int request){if (request >=10 && request < 20){System.out.println(this.getClass().getSimpleName()+" 处理请求 "+request);}else if (successor != null){successor.handleRequest(request);}}
}
class ConcreteHandler3 extends Handler{public void handleRequest(int request){if (request >=20 && request < 30){System.out.println(this.getClass().getSimpleName()+" 处理请求 "+request);}else if (successor != null){successor.handleRequest(request);}}
}

客户端

public class Test {public static void main(String[] args) {System.out.println("**********************************************");       System.out.println("《大话设计模式》代码样例");System.out.println(); Handler h1 = new ConcreteHandler1();Handler h2 = new ConcreteHandler2();Handler h3 = new ConcreteHandler3();h1.setSuccessor(h2);h2.setSuccessor(h3);int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };for(int request : requests) {h1.handleRequest(request);}System.out.println();System.out.println("**********************************************");}
}

职责链的好处

当客户提交一个请求时,请求是沿链传递直至有一个 ConcreteHandler对象负责处理它。

请求者不知道是哪个对象进行处理的。这就使得接收者和发送者都没有对方的明确信息,链路中的对象也不必知道整个链路的结构,只需要知道后继者即可。

可以随时地增加或修改链路的结构,增强了给对象指派职责的灵活性。

也要当心,一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。

职责链应用

公司有经理,总监,总经理。不同的请求,需要不同的人处理。可以用职责链模式来处理请求。
在这里插入图片描述
Request 请求类。
Manager 管理者抽象类。
CommonManager 经理类。
Direcor 总监类。
GeneralManager 总经理类。

申请类

//申请
class Request {//申请类别private String requestType;public String getRequestType(){return this.requestType;}public void setRequestType(String value){this.requestType = value;}//申请内容private String requestContent;public String getRequestContent(){return this.requestContent;}public void setRequestContent(String value){this.requestContent = value;}//数量private int number;public int getNumber(){return this.number;}public void setNumber(int value){this.number = value;}
}

管理者抽象类

abstract class Manager{protected String name;public Manager(String name){this.name = name;}//设置管理者上级protected Manager superior;public void setSuperior(Manager superior){this.superior = superior;}//请求申请public abstract void requestApplications(Request request);
}

具体的管理类

//普通经理
class CommonManager extends Manager{public CommonManager(String name){super(name);}public void requestApplications(Request request){if (request.getRequestType()=="请假" && request.getNumber()<=2)System.out.println(this.name+":"+request.getRequestContent()+ "数量:"+request.getNumber()+"天,被批准");else {if (this.superior != null)this.superior.requestApplications(request);}}
}
//总监
class Director extends Manager{public Director(String name){super(name);}public void requestApplications(Request request){if (request.getRequestType()=="请假" && request.getNumber()<=5)System.out.println(this.name+":"+request.getRequestContent()+"数量:"+request.getNumber()+"天,被批准");else {if (this.superior != null)this.superior.requestApplications(request);}}
}
//总经理
class GeneralManager extends Manager{public GeneralManager(String name){super(name);}public void requestApplications(Request request){if (request.getRequestType()=="请假"){System.out.println(this.name+":"+request.getRequestContent()+"数量:"+request.getNumber()+"天,被批准");}else if (request.getRequestType()=="加薪" && request.getNumber()<=5000){System.out.println(this.name+":"+request.getRequestContent()+"数量:"+request.getNumber()+"元,被批准");}else if (request.getRequestType()=="加薪" && request.getNumber()>5000){System.out.println(this.name+":"+request.getRequestContent()+"数量:"+request.getNumber()+"元,再说吧");}}
}

客户端

public class Test {public static void main(String[] args) {System.out.println("**********************************************");       System.out.println("《大话设计模式》代码样例");System.out.println(); // 设置职责链CommonManager manager = new CommonManager("金利");Director director = new Director("宗剑");GeneralManager generalManager = new GeneralManager("钟精励");manager.setSuperior(director);director.setSuperior(generalManager);// 发起请求Request request = new Request();request.setRequestType("请假");request.setRequestContent("小菜请假");request.setNumber(1);manager.requestApplications(request);Request request2 = new Request();request2.setRequestType("请假");request2.setRequestContent("小菜请假");request2.setNumber(4);manager.requestApplications(request2);Request request3 = new Request();request3.setRequestType("加薪");request3.setRequestContent("小菜请求加薪");request3.setNumber(5000);manager.requestApplications(request3);Request request4 = new Request();request4.setRequestType("加薪");request4.setRequestContent("小菜请求加薪");request4.setNumber(10000);manager.requestApplications(request4);System.out.println();System.out.println("**********************************************");}
}

运行结果
在这里插入图片描述
请求者不必知道处理者是谁。想要增加管理者,只需要增加一个具体的管理类,设置好处理的职责链即可,对于客户端是透明的。

相关内容

热门资讯

周代音乐内容分为几类 周代音乐内容分为几类A.3 B.4 C.5 D.6答案错误,务信,被坑了
古代的叙事诗 古代的叙事诗那个《孔雀东南飞》可能是,还有《木兰诗》、《长恨歌》、《琵琶行》应该也是的。其实是不是叙...
最新放假通知!连休8天 今天是端午节假期的最后一天下次休假在啥时候?根据国务院办公厅关于2025年部分节假日安排的通知今年的...
白头发男主角是王爷的小说 白头发男主角是王爷的小说不嫁妖孽王爷 白发王妃(女主白了头发,男主为了女主喝了一种药也白了头发)
用物理学原理解释彩虹为什么是弯... 用物理学原理解释彩虹为什么是弯的,中午为何很难看到彩虹是空气中水蒸气浓度不同造成的色散,所以必须在比...
大幅超去年同期 2025端午档... 据网络平台数据,截至6月2日12时47分,2025年端午档电影票房破4亿,大幅超去年同期。合家欢电影...
东方海洋:全资子公司取得医疗器... 每经AI快讯,6月2日,东方海洋公告,全资子公司艾维可生物科技有限公司自主研发的铁蛋白(Fer)测定...
晶科能源:收到政府补助9800... 晶科能源(688223)公告,5月29日收到政府补助人民币9800万元,属于与收益相关的政府补助款项...
北汽蓝谷:子公司5月销量同比增... 6月2日,北汽蓝谷公告称,子公司北京新能源汽车股份有限公司5月份产量为13,433辆,同比增长216...
采访体育记者可以问什么问题 采访体育记者可以问什么问题要做一个体育记者的人物专访,请问有什么问题可以问啊?求助啊.....为什么...
高凌信息:终止发行股份及支付现... 高凌信息(688175.SH)公告称,公司决定终止发行股份及支付现金购买资产并募集配套资金事项,主要...
为了培养学生吃苦耐劳、坚强自立... 为了培养学生吃苦耐劳、坚强自立的精神,教师给学生们讲了“卧薪尝胆”的故事。这体现了哪项德育方法?()...
送你一片浪漫花海 和薰衣草一起... 位于新疆伊犁河谷中部的伊宁县天山花海景区是国内薰衣草连片种植面积最大的薰衣草基地。这两天,当地2.2...
奇瑞集团5月销售汽车20.57... 人民财讯6月2日电,奇瑞集团消息,奇瑞集团2025年5月销售汽车20.57万辆,同比增长9.1%。其...
【特稿】一堂课、一座桥、一程游... “天津的企业给我们出资建设温室大棚,又手把手地教我们种植技术,还主动为我们的农产品找销路,实在太感谢...
一堂课、一座桥、一程游、一束菇... 转自:津云庆阳与天津相隔千山万水,但“对口帮扶”让两座城市亲如兄弟。海河之水悄然润泽着董志塬的沟壑,...
华仁药业:持股5%以上股东华仁... 华仁药业6月2日公告,公司持股5%以上股东华仁世纪集团计划自2025年6月24日至2025年9月23...
“苏超”火了!网友:没有人情世... 转自:宁波晚报足球世界里,太多夹杂着底蕴比拼与恩怨情仇的高手过招,被冠以“德比”之名而享誉全球——意...
A股千亿级研发投入行业:建筑行...   在科技自立自强与产业链升级的双重驱动下,A股上市公司的研发投入正成为观察中国经济动能转换的关键窗...
适合一个人干的小生意,夫妻店创...   嗨,我的朋友们。夫妻可以做生意吗      一起?对于做小生意,没问题。      但是做大生意...