耦合举例:在一个公司中,如果作为普通员工的你,如果想要请假的话,组长可以签字批准,科长也可以签字批准,部门经理也能签字批准。以上任何一位领导都能签字通过,那么他们在这方面的工作内容就存在了耦合。同样在程序中也一样,类A发出请求,类B可以处理A的请求,类C可以,类D也可以。这样很多类都能处理同一件事情,这样代码中就存在耦合。
针对这种情况就可以使用职责链模式进行解耦处理:
职责链模式的定义:职责链模式是一种行为型设计模式,它通过将请求处理对象组织成链式结构,使得请求在这些处理对象之间传递,直到一个处理对象负责处理请求,这种设计可以降低处理对象之间的耦合,提高代码的可扩展性。
举例:组长处理请假签字,科长A负责表彰签字,科长B负责培训签字,科长C负责加薪签字,部门经理负责升级签字。员工在系统中提交技能培训请求,组长看到后自己负责的是请假签字处理不了然后将请求传给科长A,科长A发现自己负责加薪签字处理不了于是传给科长B,科长B负责培训签字,查看其内容:写诗培训,你小子是个写程序的,装什么文化人,直接把请求打回来。
再举例:你提交了一份加薪申请:月薪加1500,组长传给科长A,科长A传给科长B然后到科长C,科长C看了请求类型有看了内容,决定受理,最后给你的月薪涨了100元............
以上就是对职责链模式的举例。
职责链模式的优点:
降低耦合性:职责链模式将处理请求的对象之间解耦,每个处理对象只需要知道其后继处理者。这使得处理对象可以独立地扩展和修改,而无需修改其他处理对象的代码。
灵活性:通过职责链模式,可以灵活地改变处理请求的对象顺序,这使得系统可以在运行时动态地调整责任链。此外,还可以根据需要添加或删除处理对象,以适应不同的业务场景。
可扩展:职责链模式允许在运行时动态地添加或修改处理对象。这种特性使得在需要扩展系统功能时,可以直接添加新的处理对象,而无需修改现有的代码。
方便维护:职责链模式使得请求处理对象之间的关系更加清晰,有助于提高代码的可维护性。当需要修改或扩展某个处理对象时,只需关注该对象及其后继处理者,无需修改整个处理链。
缺点:
性能问题:在职责链模式中,请求需要在处理对象链中逐个传递,直到找到合适的处理对象。如果链上的处理对象数量较多,请求处理过程可能会变得低效。因此,在性能要求较高的场景中,使用职责链模式可能导致性能下降。
定位问题较困难:当责任链过长时,调试和维护可能变得困难。如果某个处理对象没有正确处理请求或者将请求传递给后继处理者,可能需要仔细检查链上的每个处理对象,才能找到问题所在。
#include <iostream>
using namespace std;
enum reqType
{
holiday,
praise,
train,
wage,
grade
};
class Request
{
public:
reqType type;
int data;
Request(reqType t , int d)
{
type = t;
data = d;
}
};
//抽象处理者
class Handler
{
public:
Handler() { m_pNextHandler = NULL; }
virtual ~Handler() {}
//设置下一个处理者
void SetNextHandler(Handler *successor) { m_pNextHandler = successor; }
//处理请求
virtual void HandleRequest(Request request) = 0;
protected:
Handler *m_pNextHandler; // 后继者
};
class Director :public Handler
{
public:
//处理请求
virtual void HandleRequest(Request request)
{
if(request.type == reqType::holiday)
{
if (request.data <= 3)
{
cout << "我是组长小于三天,同意了!" << endl;
}
else
{
cout << "我是组长,超了,打回" << endl;
}
}
else
{
m_pNextHandler->HandleRequest(request);
}
}
};
class ManagerA :public Handler
{
public:
//处理请求
virtual void HandleRequest(Request request)
{
if(request.type == reqType::holiday)
{
if (request.data <= 2)
{
cout << "我是科长A一等功二等功,同意公开表彰!" << endl;
}
else
{
cout << "我是科长A,功绩不够!!" << endl;
}
}
else
{
m_pNextHandler->HandleRequest(request);
}
}
};
class ManagerB :public Handler
{
public:
//处理请求
virtual void HandleRequest(Request request)
{
if(request.type == reqType::train)
{
if (request.data == 1)
{
cout << "我是科长B 课程1是计算机类,去培训吧!" << endl;
}
else
{
cout << "我是科长B,不同意此次抚摸鱼!" << endl;
}
}
else
{
m_pNextHandler->HandleRequest(request);
}
}
};
class ManagerC :public Handler
{
public:
//处理请求
virtual void HandleRequest(Request request)
{
if(request.type == reqType::wage)
{
if (request.data > 90)
{
cout << "我是科长C 绩效90分,给你加100工资!" << endl;
}
else
{
cout << "我是科长C,绩效太差了!" << endl;
}
}
else
{
m_pNextHandler->HandleRequest(request);
}
}
};
class DepartmentManager :public Handler
{
public:
//处理请求
virtual void HandleRequest(Request request)
{
if(request.type == reqType::grade)
{
if (request.data == 100)
{
cout << "我是部门经理 考核100分,给你职级加一!" << endl;
}
else
{
cout << "我是部门经理,考核不行,这次算了!" << endl;
}
}
else
{
//m_pNextHandler->HandleRequest(request);
cout << "无人处理" << endl;
}
}
};
int main()
{
Handler *director = new Director;
Handler *manager_a = new ManagerA;
Handler *manager_b = new ManagerB;
Handler *manager_c = new ManagerC;
Handler *dm = new DepartmentManager;
//设置责任链
director->SetNextHandler(manager_a);
manager_a->SetNextHandler(manager_b);
manager_b->SetNextHandler(manager_c);
manager_c->SetNextHandler(dm);
Request req1(reqType::wage,92); //涨工资请求,绩效92分
Request req2(reqType::grade,99); //职级提升请求,考核99分
director->HandleRequest(req1);
director->HandleRequest(req2);
return 0;
}
/*结果:
我是科长C 绩效90分,给你加100工资!
我是部门经理,考核不行,这次算了!
请按任意键继续. . .*/