主要是的是在基类中要有一个基类指针,在子类中这个基类指针指向一个父类对象,然后就可以调用父类对象的处理方法,层层传递。
但是《设计模式:…》中说的有点模糊,在网上看到这个写的不错,我稍作修改放上来:
#include<iostream>
using namespace std;
class Handler
{
public:
void setNextHandler(Handler* h)
{
nextHandler = h;
}
virtual void responseRequest(int days) = 0;
Handler()
{
nextHandler = nullptr;
}
virtual ~Handler() {};
protected:
Handler* nextHandler;
};
class Director :public Handler
{
public:
virtual void responseRequest(int days)
{
cout << "员工:我想请" << days << "天假;" << endl;
if (days <= 1)
{
cout << "主管:我可以批你1天假。" << endl;
}
else
{
cout << "主管:我不能批你" << days << "天假,我需要上报。" << endl;
nextHandler->responseRequest(days);
}
}
};
class Manager : public Handler
{
public:
virtual void responseRequest(int days)
{
if (days <= 3)
{
cout << "经理:我可以批你" << days << "天假。" << endl;
}
else
{
cout << "经理:我不能批你" << days << "天假,我需要上报。" << endl;
nextHandler->responseRequest(days);
}
}
};
class Boss : public Handler
{
public:
virtual void responseRequest(int days)
{
if (days <= 7)
{
cout << "老板:我可以批你" << days << "天假。" << endl;
}
else
{
cout << "老板:我不能批你" << days << "天假,时间太长,驳回。" << endl;
}
}
};
class Staff
{
public:
Staff(Director* pd = 0) :pDirector(pd) {}
void request(int days)
{
if (pDirector)
pDirector->responseRequest(days);
}
void setDirector(Director* pd)
{
pDirector = pd;
}
private:
Director* pDirector;
};
int main()
{
Boss *pBoss = new Boss();
Manager *pManager = new Manager();
Director *pDirector = new Director();
Staff *pStaff = new Staff(pDirector);
pDirector->setNextHandler(pManager);
pManager->setNextHandler(pBoss);
pStaff->request(8);
system("pause");
return 0;
}
运行结果: