【2013.3.2】标题不长。——Chain Of Responsibility

// // // // // // // // //

///2013.3.2

// // // // // // // // //


《公司的力量》


还记得几年之前,

笔者每天中午都会看央视这个节目。


波澜壮阔的背景音乐后面,

是"公司"这个庞大组织的前世今生。

随着首个蒸汽机的汽笛声响起,

一场现代的战争拉开了帷幕,

从欧美到东亚,

从洛克菲勒,西门子到京瓷,丰田,

从联想到阿里巴巴。


如今公司这个形式无疑是最具影响力的组织之一,

以至于片中直言:推动世界前进的不是政府,而是公司。


公司的力量有多大?

举个最简单的例子,

如果当初爱迪生只是发明了一个灯泡,

而没有开办一家电气公司,

那么他就不会有如今妇孺皆知的声望,

更不会被誉为"那个照亮黑暗的男人(笔者封)"了。


"公司"之所以能有今天的影响力,

很大程度上源于其成熟化的管理与合理的运营机制。


就比如说公司的命令处理方式:

CEO经过董事会的同意,

向下发布了一条命令:开发并销售一批新型号电脑。

于是,

"责任链"开始了。


命令下放到市场部门,于是市场部门开始着手进行市场调研。

市场部分继续传到产品研发部门,于是生产部门开始着手制作。

产品研发部门要求财务部门发放研发基金,于是财务部门开始计算费用。

公关部门开始协调人事关系,推动生产力。

研发完成后,销售部门开始营销。


进行完这些环节后,

终于完成了当初的命令。


这,

就是Chain of Responsibility模式。


【核心】将命令以此传递,使各个环节完成自己的部分。从而完成最终功能。


UML图:

【2013.3.2】标题不长。——Chain Of Responsibility_第1张图片



示例代码


【大致思路】

ConcreteHandleA/B作为继承自Handle的子类,封装一个Handle*类型的变量。

当此Handle不为空时,

将处理的任务交给此Handle解决。

否则自行解决。


Handle.h

#ifndef _HANDLE_H_
#define _HANDLE_H_

class Handle
{
public:
	Handle();
	Handle(Handle* succ);

	void virtual handleRequest()=0;
	Handle* getSuccessor();

private:
	Handle* successor;
};

class ConcreteHandleA:public Handle
{
public:
	ConcreteHandleA(){}
	ConcreteHandleA(Handle* succ);

	void handleRequest();
};

class ConcreteHandleB:public Handle
{
public:
	ConcreteHandleB(){}
	ConcreteHandleB(Handle* succ);

	void handleRequest();
};

#endif 

Handle.cpp

#include "Handle.h"
#include <iostream>
using namespace std;

Handle::Handle()
{
	successor = 0;
}

Handle::Handle(Handle* succ)
{
	successor = succ;
}

Handle* Handle::getSuccessor()
{
	return successor;
}

ConcreteHandleA::ConcreteHandleA(Handle* succ):Handle(succ)
{
}

void ConcreteHandleA::handleRequest()
{
	//Have successor.
	if(getSuccessor() != 0)
	{
		cout<<"ConcreteHandleA says: Transfer it to next successor."<<endl;
		getSuccessor()->handleRequest();
	}
	//Haven't successor,handled by self.
	else
	{
		cout<<"ConcreteHandleA says: Handled by ConcreteHandleA"<<endl;
	}
}

ConcreteHandleB::ConcreteHandleB(Handle* succ):Handle(succ)
{
}

void ConcreteHandleB::handleRequest()
{
	//Have successor.
	if(getSuccessor() != 0)
	{
		cout<<"ConcreteHandleB says: Transfer it to next successor."<<endl;
		getSuccessor()->handleRequest();
	}
	//Haven't successor,handled by self.
	else
	{
		cout<<"ConcreteHandleB says: Handled by ConcreteHandleB"<<endl;
	}
}

main.cpp

#include "Handle.h"

int main()
{
	Handle* handleFirst = new ConcreteHandleA();
	Handle* handleSecond = new ConcreteHandleB(handleFirst);

	handleSecond->handleRequest();

	return 0;
}

输出结果:



【注意事项】

由于这是一个动机明确,

处理方式单一的模式。

故再次不多做讲解。

但其应用程度却非常广泛,

一般窗口之间的消息/事件处理,

都是使用此种模式进行,

希望大家能熟悉并掌握它。

你可能感兴趣的:(C++,责任链模式,C++设计模式)