职责链模式,如果用程序语言来近似描述,我理解为if else结构,感觉就是一级级的判断处理。不过将其封装成类的形式没有了if else的复杂分支,而且维护的时候也方便。
举个常见的例子:因为家里有事情处理,你需要向领导请13天的假。对于你来说,可能只需要在部门办公软件上填写申请,并提交给你的部门经理就可以了。但实际审批的话,是不是部门经理直接审批呢?肯定不是的。比如公司有规定:请假0-a天的时候你们部门经理可以直接审批;请假a-b天的时候需要研发总监审批 ;而请假天数>b天的时候则需要总经理审批。那实际上这个审批流程是怎样的呢?如果用if else的话,我知道你肯定是有答案了,但如果用职责链模式又该怎样设计呢?
因为这个模式相对好理解,这里不再啰嗦,直接上代码。
#include<iostream>
using namespace std;
//经理基类
class Manager
{
protected:
Manager* m_manager;
public:
Manager(Manager *manager) :m_manager(manager)
{
cout << "manager" << endl;
}
virtual ~Manager()
{
if (m_manager != NULL)
delete m_manager;
m_manager = NULL;
cout << "~manager" << endl;
}
virtual void handle(int days) = 0;
};
//一级经理
class Manager_Level1: public Manager
{
public:
Manager_Level1(Manager *maneger):Manager(maneger)
{
cout << "manager1" << endl;
}
~Manager_Level1()
{
if (this->m_manager != NULL)
delete m_manager;
this->m_manager = NULL;
cout << "~manager1" << endl;
}
public:
void handle(int days)
{
if (days < 3)
{
cout << "我同意了,你可以去处理你的事情了" << endl;
}
else
{
cout << "你请假太多,我做不了主,得提交给我的上司" << endl;
this->m_manager->handle(days);
}
}
};
//二级经理
class Manager_Level2 : public Manager
{
public:
Manager_Level2(Manager *maneger) :Manager(maneger)
{
cout << "manager2" << endl;
}
~Manager_Level2()
{
if (this->m_manager != NULL)
delete this->m_manager;
this->m_manager = NULL;
cout << "~manager2" << endl;
}
public:
void handle(int days)
{
if (days < 5)
{
cout << "我同意了,你可以去处理你的事情了" << endl;
}
else
{
cout << "你请假太多,我也做不了主,得提交给我的上司" << endl;
this->m_manager->handle(days);
}
}
};
//三级经理
class Manager_Level3 : public Manager
{
public:
Manager_Level3(Manager *maneger) :Manager(maneger)
{
cout << "manager3" << endl;
}
~Manager_Level3()
{
if (this->m_manager != NULL)
delete this->m_manager;
this->m_manager = NULL;
cout << "~manager3" << endl;
}
public:
void handle(int days)
{
if (days < 10)
{
cout << "我同意了,你可以去处理你的事情了" << endl;
}
else
{
cout << "你请假太多了,公司没这个规定,你还是直接辞职吧" << endl;
}
}
};
void take()
{
Manager *manager_3 = new Manager_Level3(NULL);
Manager *manager_2 = new Manager_Level2(manager_3);
Manager *manager_1 = new Manager_Level1(manager_2);
manager_1->handle(13);
delete manager_1;
return;
}
void main()
{
take();
system("pause");
return;
}