十七、责任链模式
有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求。但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整。先看看关系图:
java版:
package com.shuang.chain;
public abstract class AbstractHandler {
private Handler handler;
public Handler getHandler() {
return handler;
}
public void setHandler(Handler handler){
this.handler = handler;
}
}
package com.shuang.chain;
public interface Handler {
public void operator();
}
package com.shuang.chain;
public class MyHandler extends AbstractHandler implements Handler {
private String name;
public MyHandler(String name) {
this.name = name;
}
@Override
public void operator() {
System.out.println(name + "deal!");
if (getHandler() != null) {
getHandler().operator();
}
}
}
package com.shuang.chain;
public class Test {
public static void main(String[] args) {
MyHandler h1 = new MyHandler("h1");
MyHandler h2 = new MyHandler("h2");
MyHandler h3 = new MyHandler("h3");
h1.setHandler(h2);
h2.setHandler(h3);
h1.operator();
}
}
c++版:
#include<iostream>
using namespace std;
class CarHandle
{
public:
virtual void HandleCar()=0;
void setNextHandle(CarHandle *handle)
{
m_handle = handle;
}
protected:
CarHandle *m_handle;
};
class HeadCarHandle:public CarHandle
{
public:
virtual void HandleCar()
{
cout<<"造车头"<<endl;
if (m_handle != NULL)
{
m_handle->HandleCar();
}
}
};
class BodyCarHandle:public CarHandle
{
public:
virtual void HandleCar()
{
cout<<"造车身"<<endl;
if (m_handle != NULL)
{
m_handle->HandleCar();
}
}
};
class TailCarHandle:public CarHandle
{
public:
virtual void HandleCar()
{
cout<<"造车尾"<<endl;
if (m_handle != NULL)
{
m_handle->HandleCar();
}
}
};
int main()
{
CarHandle *headHandle = new HeadCarHandle;
CarHandle *bodyHandle = new BodyCarHandle;
CarHandle *tailHandle = new TailCarHandle;
headHandle->setNextHandle(bodyHandle);
bodyHandle->setNextHandle(tailHandle);
tailHandle->setNextHandle(NULL);
headHandle->HandleCar();
delete headHandle;
delete bodyHandle;
delete tailHandle;
system("pause");
return 0;
}