23种设计模式之(十五)责任链模式(Chain of Responsibility )
本文主要介绍23种设计模式之责任链模式,附详细python/c++示例代码。
- 概念
- 应用场景
- 注意事项
- 代码示例
- 总结
- 代码链接
责任链模式(Chain of Responsibility )
概念
责任链模式或者职责连模式,是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作职责链模式。
GoF对责任链模式的定义是:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
应用场景
(1)、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
(2)、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
(3)、可动态指定一组对象处理请求。
代码示例
C++代码示例
/************************************************************************/
/* 设计模式专题
/*
/* 责任链模式
/*
/* Author : zzl
/*
/* 编程环境: window10 vs2010
/*
/* Date : 20180918
/************************************************************************/
#include <iostream>
using namespace std;
//造完车 以后,需要把任务 传递下去
class CarHandle
{
public:
virtual void HandleCar() = 0;
CarHandle *setNextHandle(CarHandle *handle)
{
m_handle = handle;
return m_handle;
}
protected:
CarHandle *m_handle; //下一个处理单元
};
class HeadCarHandle : public CarHandle
{
public:
virtual void HandleCar()
{
printf("make car head\n");
//造 玩车头 以后 把任务递交给 下一个处理者
if (m_handle != NULL)
{
m_handle->HandleCar(); //
}
}
};
class BodyCarHandle : public CarHandle
{
public:
virtual void HandleCar()
{
printf("make car body\n");
//造 造 车身 以后 把任务递交给 下一个处理者
if (m_handle != NULL)
{
m_handle->HandleCar(); //
}
}
};
class TailCarHandle : public CarHandle
{
public:
virtual void HandleCar()
{
printf("make car tail\n");
//造 造车尾 以后 把任务递交给 下一个处理者
if (m_handle != NULL)
{
m_handle->HandleCar(); //
}
}
};
void main()
{
CarHandle *headHandle = new HeadCarHandle;
CarHandle *bodyHandle = new BodyCarHandle;
CarHandle *tailHandle = new TailCarHandle;
headHandle->setNextHandle(tailHandle);
tailHandle->setNextHandle(bodyHandle);
bodyHandle->setNextHandle(NULL);
headHandle->HandleCar();
delete headHandle;
delete bodyHandle;
delete tailHandle;
}
python代码示例
# -*- coding: utf-8 -*-
###################################################################
# 设计模式专题
#
# 责任链模式
#
# Author : zzl
#
# 编程环境: window10 python2.7
#
# Date : 20180918
##################################################################
# 造完车以后, 需要把任务传递下去
class CarHandle(object):
def __init__(self):
self.m_next_handle = None
def handcar(self):
pass
class HeadCarHandle(CarHandle):
def handcar(self):
print("make car head")
# 造玩车头以后把任务递交给下一个处理者
if self.m_next_handle:
self.m_next_handle.handcar()
class BodyCarHandle(CarHandle):
def handcar(self):
print("make car body ")
# 造玩车身以后把任务递交给下一个处理者
if self.m_next_handle:
self.m_next_handle.handcar()
class TailCarHandle(CarHandle):
def handcar(self):
print("make car tail ")
# 造玩车身以后把任务递交给下一个处理者
if self.m_next_handle:
self.m_next_handle.handcar()
if __name__ == "__main__":
headHandle = HeadCarHandle()
bodyHandle = BodyCarHandle()
tailHandle = TailCarHandle()
headHandle.m_next_handle = tailHandle
tailHandle.m_next_handle = bodyHandle
bodyHandle.m_next_handle = None
headHandle.handcar()