看到这里的各位加薪申请都是总监批 :-))

十八道胡同 2013-06-07 09:29:17
加精
最近在学习设计模式,顺便写了下自己的理解。。

下面的是责任链模式。。

概述:
辛辛苦苦了工作了一年,终于可以加薪了,向主管提交了加薪申请,主管一看不得了,自己职权不够,批不了,主管把申请上交总监,总监发现自己也批不了,申请到了总经理手中,总经理一看,小伙子口气不小了,有胆识敢申请,先来谈下心。预知后事如何,请看下回分解。
这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。

类图与实例:
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
样例:
#include <iostream>
#include <string>
using namespace std;

// 请求
class Request
{
public:
int m_nNumber;
};

// 管理者
class Manager
{
public:
Manager(string temp) { name = temp; }
void SetSuccessor(Manager* temp) { manager = temp; }
virtual void GetRequest(Request* request) = 0;
protected:
Manager* manager;
string name;
};

// 经理
class CommonManager : public Manager
{
public:
CommonManager(string strTemp) : Manager(strTemp) {}
virtual void GetRequest(Request* request);
};

void CommonManager::GetRequest(Request* request)
{
if (request->m_nNumber>=0 && request->m_nNumber<1000)
{
cout << name << " 处理了请求: " << request->m_nNumber << endl;
}
else
{
manager->GetRequest(request);
}
}

// 总监
class Majordomo : public Manager
{
public:
Majordomo(string strTemp) : Manager(strTemp) {}
virtual void GetRequest(Request* request);
};

void Majordomo::GetRequest(Request* request)
{
if (request->m_nNumber <= 5000)
{
cout << name << " 处理了请求: " << request->m_nNumber << endl;
}else
{
manager->GetRequest(request);
}
}

//总经理
class GeneralManager: public Manager
{
public:
GeneralManager(string name):Manager(name) {}
virtual void GetRequest(Request* request) //总经理可以处理所有请求
{
cout << name << " 处理了请求: " << request->m_nNumber << endl;
}
};

int main(){

Manager* common = new CommonManager("张经理");
Manager* major = new Majordomo("李总监");
GeneralManager* general = new GeneralManager("赵总");
common->SetSuccessor(major);
major->SetSuccessor(general);
Request* rq = new Request();

rq->m_nNumber = 999;
common->GetRequest(rq);

rq->m_nNumber = 4999;
common->GetRequest(rq);

rq->m_nNumber = 6999;
common->GetRequest(rq);

delete rq;
delete major;
delete common;
delete general;
return 0;
}


要点与实现:
1.要注意的是:一个请求到链的最后可能也没有处理,所以一定要配置得当.
2.责任链模式并不创建责任链。责任链的创建必须由系统的其它部分创建出来。
3.责任链模式降低了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。一个链可以是一条线,一个树,也可以是一个环。如下图所示,责任链是一个树结构的一部分。


看到这里的各位加薪申请都是general批... :-))

我的博客里有其他已分享的理解:
我所理解的设计模式(C++实现)——责任链模式(Chain Of Responsibility Pattern)
我所理解的设计模式(C++实现)——代理模式(Proxy Pattern)
我所理解的设计模式(C++实现)——享元模式(Flyweight Pattern)
我所理解的设计模式(C++实现)——外观模式(Facade Pattern)
我所理解的设计模式(C++实现)——装饰者模式(Decorator Pattern)
我所理解的设计模式(C++实现)——组合模式(Composite Pattern)
我所理解的设计模式(C++实现)——适配器模式(Adapter Pattern)
我所理解的设计模式(C++实现)——原型模式(Prototype Pattern)
我所理解的设计模式(C++实现)——建造者模式(Builder Pattern
我所理解的设计模式(C++实现)——抽象工厂模式(Abstract Factory Pattern)
我所理解的设计模式(C++实现)——工厂方法模式(Factory Method Pattern
我所理解的设计模式(C++实现)——简单工厂模式(Simple Factory Pattern)
我所理解的设计模式(C++实现)——桥模式(Bridge Pattern)
我所理解的设计模式(C++实现)——单例模式(Singleton Pattern)
...全文
2442 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-07-04
  • 打赏
  • 举报
回复
Windows的钩子和消息以及MFC的消息处理,等等,好像就是这种,还有C#的委托,VB的事件,似乎也是这种的。
SNAKE-SNAKE 2013-06-20
  • 打赏
  • 举报
回复
kirainstorm 2013-06-20
  • 打赏
  • 举报
回复
mark
xiao0915 2013-06-19
  • 打赏
  • 举报
回复
先谈心。。。。。
Luo_Bryant 2013-06-19
  • 打赏
  • 举报
回复
学习了。。。
十八道胡同 2013-06-19
  • 打赏
  • 举报
回复
引用 21 楼 yuansanwan123 的回复:
在vc6.0里运行了下,好用,lz的哪些博客真不错。我是新手,现在在学c++,等我看完c++primer plus 一定过来全部看完
谢谢,共同学习
氰客 2013-06-19
  • 打赏
  • 举报
回复
mark
sanwan 2013-06-19
  • 打赏
  • 举报
回复
在vc6.0里运行了下,好用,lz的哪些博客真不错。我是新手,现在在学c++,等我看完c++primer plus 一定过来全部看完
geleg 2013-06-19
  • 打赏
  • 举报
回复
cool--
c_sdn_shang_bu_qi 2013-06-19
  • 打赏
  • 举报
回复
请不要故弄玄虚thank you
十八道胡同 2013-06-19
  • 打赏
  • 举报
回复
引用 31 楼 sunxing007 的回复:
你的命名也专业一点好不? 什么Majordomo, 什么玩意儿. TeamLeader->Manager->Director->ManagerDirector
淡定
sunxing007 2013-06-19
  • 打赏
  • 举报
回复
你的命名也专业一点好不? 什么Majordomo, 什么玩意儿. TeamLeader->Manager->Director->ManagerDirector
hello_world000 2013-06-19
  • 打赏
  • 举报
回复
虽然讨论的是设计模式,我还是想说下,最好类类型的参数还是别值传递
mindsky 2013-06-19
  • 打赏
  • 举报
回复
更正,switch只适合值判断,如果是布尔判断还是要用if
mindsky 2013-06-19
  • 打赏
  • 举报
回复
从首页进来看到了楼主的责任链模式,立马用C#实现了一下,发现这个设计挺精巧的, 不过在实际编程中我估计大家遇到需要用责任链模式来解决的逻辑处理一般都会直接使用switch逻辑结构解决,省事!
Hi幸福来敲门 2013-06-19
  • 打赏
  • 举报
回复
十八道胡同 2013-06-19
  • 打赏
  • 举报
回复
引用 24 楼 rainbowsix 的回复:
能画个类图就更好了
博客里面有类图
libaoxia 2013-06-19
  • 打赏
  • 举报
回复
标题挺有意思的
无聊找乐 2013-06-19
  • 打赏
  • 举报
回复
能画个类图就更好了
line_us 2013-06-18
  • 打赏
  • 举报
回复
先来谈下心。
加载更多回复(16)

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧