职责链模式使得一个软件系统中的多个对象都有机会处理请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止,从而避免请求的发送者和接收者之间产生强耦合关系。
常见的应用程序框架中有很多职责链模式的应用,比如 MFC 中的消息处理机制、 Android 中的按键处理流程、Qt 中的事件处理机制等等。
下图是职责链模式的 UML 图示:
这里举一个简单的示例。是这样的,某个家庭有一个小菇凉,有爸爸、妈妈、奶奶,小菇凉想要吃巧克力,就挨个问,直到有人同意就开吃。
头文件:
class Child {
Child();
void eatChocolate();
void setHandler(Handler *handler);
private:
Handler * m_pHandler;
};
class Handler {
Handler();
virtual ~Handler();
virtual bool canIEatChocolate() = 0;
void setSuccessor(Handler * handler){ m_pSuccessor = handler;}
Handler * successor(){ return m_pSuccessor;}
private:
Handler * m_pSuccessor;
};
class Mother : public Handler{
bool canIEatChocolate();
};
class Father : public Handler{
bool canIEatChocolate();
};
class Grandmother : public Handler{
bool canIEatChocolate();
};
源文件(这里设定爸爸、妈妈都不让吃,奶奶让吃):
Child::Child():m_handler(0)
{}
void Child::eatChocolate(){
if(m_pHandler->canIEatChocolate()){
laughThenEat();
}else{
cry();
}
}
void Child::setHandler(Handler * handler){
m_pHandler = handler;
}
Handler::Handler():m_pSuccessor(0){
}
bool Mother::canIEatChocolate(){
if(successor()){
return successor->canIEatChocolate();
}else{
return false;
}
}
bool Father::canIEatChocolate(){
if(successor()){
return successor->canIEatChocolate();
}else{
return false;
}
}
bool Grandmother::canIEatChocolate(){
if(successor()){
return successor->canIEatChocolate();
}else{
return true;
}
}
驱动代码, main() 函数:
int main(int argc, char**argv)
{
Child * child = new Child;
Mother * mother = new Mother;
Father * father = new Father;
Grandmother * grandmother = new Grandmother;
mother->setSuccessor(father);
father->setSuccessor(grandmother);
child->setHandler(mother);
child->eatChocolate();
return 0;
}
好啦,以上就是职责链模式的一个简单实现。这里手动建立了一个链表,将链表头指针设置给 Child 。另一个更常用的做法,是在 Child 内部维护一个链表,在Child::eatChocolate() 函数内部使用循环遍历链表,遇到 canIEatChocolate() 返回 true 就停止,这里不再赘述了。
回顾一哈:
分享到:
相关推荐
C#面向对象设计模式纵横谈(20):(行为型模式) Chain Of Responsibility 职责链模式
C#面向对象设计模式纵横谈(20):(行为型模式) Chain Of Responsibility 职责链模式
C#面向对象设计模式 Chain of Responsibility 职责链模式 视频讲座下载
C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式) (Level 300)
C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式)
职责链模式 设计模式 Chain of Responsibility 若有问题望指出。
本文实例讲述了Python设计模式之职责链模式原理与用法。分享给大家供大家参考,具体如下: 职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免发送者和接收者的耦合关系。将对象连成链并...
创建模式: ...设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor
设计模式参考文档 ...设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor
C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式) C#面向对象设计模式纵横谈(15):(行为型模式) Command 命令模式 C#面向对象设计模式纵横谈(16):(行为型模式) Interpreter 解释...
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 职责链模式的一个...
创建型: 1. 单件模式(Singleton ... 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)
一、 职责链(Chain of Responsibility)模式 160 二、 责任链模式的结构 160 三、 责任链模式的示意性源代码 160 四、 纯的与不纯的责任链模式 163 五、 责任链模式的实际应用案例 163 六、 责任链模式的实现 168 ...
php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * */ abstract class Handler { ...
责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter Pattern) 迭代器模式(Iterator Pattern) 中介者模式(Mediator Pattern) 备忘录模式...
用C++简单的实现职责链(Chain of Responsibility)。
本电子书一共两个压缩文档,本文件为part2. ...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
13)职责链模式(Chain of Responsibility) 14)命令模式(Command) 15)解析器模式(Interpreter) 16)迭代器模式(Iterator) 17)中介模式(Mediator) 18)备忘录模式(Memento) 19)观察者模式(Observer)...