// // // // // // // // //
///2013.3.2
// // // // // // // // //
《公司的力量》
还记得几年之前,
笔者每天中午都会看央视这个节目。
波澜壮阔的背景音乐后面,
是"公司"这个庞大组织的前世今生。
随着首个蒸汽机的汽笛声响起,
一场现代的战争拉开了帷幕,
从欧美到东亚,
从洛克菲勒,西门子到京瓷,丰田,
从联想到阿里巴巴。
如今公司这个形式无疑是最具影响力的组织之一,
以至于片中直言:推动世界前进的不是政府,而是公司。
公司的力量有多大?
举个最简单的例子,
如果当初爱迪生只是发明了一个灯泡,
而没有开办一家电气公司,
那么他就不会有如今妇孺皆知的声望,
更不会被誉为"那个照亮黑暗的男人(笔者封)"了。
"公司"之所以能有今天的影响力,
很大程度上源于其成熟化的管理与合理的运营机制。
就比如说公司的命令处理方式:
CEO经过董事会的同意,
向下发布了一条命令:开发并销售一批新型号电脑。
于是,
"责任链"开始了。
命令下放到市场部门,于是市场部门开始着手进行市场调研。
↓
市场部分继续传到产品研发部门,于是生产部门开始着手制作。
↓
产品研发部门要求财务部门发放研发基金,于是财务部门开始计算费用。
↓
公关部门开始协调人事关系,推动生产力。
↓
研发完成后,销售部门开始营销。
进行完这些环节后,
终于完成了当初的命令。
这,
就是Chain of Responsibility模式。
【核心】将命令以此传递,使各个环节完成自己的部分。从而完成最终功能。
UML图:
示例代码
【大致思路】
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
#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; } }
#include "Handle.h" int main() { Handle* handleFirst = new ConcreteHandleA(); Handle* handleSecond = new ConcreteHandleB(handleFirst); handleSecond->handleRequest(); return 0; }
【注意事项】
由于这是一个动机明确,
处理方式单一的模式。
故再次不多做讲解。
但其应用程度却非常广泛,
一般窗口之间的消息/事件处理,
都是使用此种模式进行,
希望大家能熟悉并掌握它。