设计模式之职责链模式
来源:互联网 发布:无线路由器mac绑定 编辑:程序博客网 时间:2024/06/05 04:35
职责链模式
注意:
比较长的方法,多条的分支,这些其实都是代码的坏味道。
1. 职责链模式:
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
2. 职责链模式:
Handler类,定义一个处理请示的接口。
ConcreteHandler类,具体处理者类,处理它所负责的请求,可访问它的后继者,如果可处理该请求,就处理,否则就将该请求转发给它的后继者。
好处:
当客户提交一个请求,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。
可以随时的增加或修改处理一个请求的机构。增强了给对象指派职责的灵活性。
也要当心一个请求可能到了链的末端也得不到处理,或者因为没有正确配置而得不到处理。
3. 职责链模式的例子:
#include<iostream>#include <string>using namespace std;class Request{public:string requestType;string requestContent;int number;};class Manager//Handler{protected:string name;Manager *superior;//上级public:Manager(string name){this->name=name;}//设置管理者的上级void setSuperior(Manager *superior)//设置继任者{this->superior=superior;}virtual void requestApplications(Request *request)=0;};class CommonManager:public Manager{public:CommonManager(string name):Manager(name){}//经理的权限就是能批准2天内的假期,其余的就要转到上级void requestApplications(Request *request){if(request->requestType=="请假" && request->number<=2){cout<<name<<" "<<request->requestContent<<" 数量: "<<request->number<<"被批准"<<endl;}else {if(superior!=NULL){superior->requestApplications(request);}}}};class Majordomo:public Manager{public:Majordomo(string name):Manager(name){}void requestApplications(Request *request){if(request->requestType=="请假" && request->number<=5){cout<<name<<" "<<request->requestContent<<" 数量: "<<request->number<<"被批准"<<endl;}else {if(superior!=NULL){superior->requestApplications(request);}}}};class GeneralManager:public Manager{public:GeneralManager(string name):Manager(name){}void requestApplications(Request *request){if(request->requestType=="请假"){cout<<name<<" "<<request->requestContent<<" 数量: "<<request->number<<"被批准"<<endl;}}};int main(){CommonManager *jinli=new CommonManager("经理"); Majordomo *zongjian=new Majordomo("总监");GeneralManager *zhongjingli=new GeneralManager("总经理");jinli->setSuperior(zongjian);zongjian->setSuperior(zhongjingli);Request *request=new Request();request->requestType="请假";request->requestContent="李俊宏请假";request->number=1;jinli->requestApplications(request);request->requestType="请假";request->requestContent="李俊宏请假";request->number=4;jinli->requestApplications(request);request->requestType="请假";request->requestContent="李俊宏请假";request->number=10;jinli->requestApplications(request);return 0;}
阅读全文
0 0
- 设计模式 之 职责链
- 设计模式之职责链
- 设计模式之职责链
- 设计模式之职责链模式
- 设计模式之职责链模式
- C# 设计模式之 职责链模式
- 设计模式之职责链模式
- 大话设计模式之职责链模式
- 设计模式之职责链模式
- 设计模式之职责链模式
- 大话设计模式之职责链模式
- 设计模式之职责链模式
- 设计模式之-----职责链模式
- 设计模式之职责链模式
- 设计模式之职责链模式
- 设计模式之职责链模式
- 设计模式之职责链模式
- C++设计模式之职责链模式
- 动态代理的java实现
- 接收前台用echarts生成的若干张图表转为word提供下载
- java.math.BigInteger
- 一个demo学会css
- 现在才知道Java中变量声明可以放在赋值后面。。。
- 设计模式之职责链模式
- 快速、插入、冒泡排序,二分查找
- CentOS7 安装ARM Linux交叉编译环境
- mysql中的模糊查询
- 代理模式 | Proxy Pattern
- 图论小结(最小生成树)
- map函数学习
- X问题
- RecyclerView的ItemAnimator