本文借鉴《大话设计模式》,算是对自己学习的总结,也希望分享下所学知识~~
职责链模式(Chain of Responsibility):
使多个对象都有机会处理请求,从而避免发送者和接收者之间的耦合关系。
将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
case 1:请假系统
请假一般都会先和上级leader审批,审批过了再部门经理审批,再老板审批。
这样的程序怎么设计呢?
使用一个Manager设计:
class Manager
{
public void GetResult(string managerLevel)
{
if (managerLevel == "leader")
{
//Do something
}
else if (managerLevel == "部门经理")
{
//Do something
}
else if (managerLevel == "老板")
{
//Do something
}
}
}
这样写的问题:
1.类中方法过长
2.有太多的分支判断
3.类中有太多职责,违背了单一职责原则
4.新增管理类别需要修改类,违反了开闭原则
如何改进?
1.不同管理等级的人做成子类,方便扩展
2.可以传递用户的行为,直到请求成功解决
代码如下:
1.定义抽象处理请求类
abstract class Manager
{
protected Manager superior;
public void SetSuperior(Manager superior)
{
this.superior = superior;
}
public abstract void HandleRequest(string request);
}
2.定义具体处理请求类。
可以访问它的后继者,如果可以处理就处理,如果不可以就交给后继者。
class LeaderManager : Manager
{
public override void HandleRequest(string request)
{
if (request == "leader")//代表可以处理该请求,具体条件看具体情况
{
//Do something
}
else
{
if (superior != null)
superior.HandleRequest(request);
}
}
}
class CommonManager : Manager
{
public override void HandleRequest(string request)
{
if (request == "经理")//代表可以处理该请求,具体条件看具体情况
{
//Do something
}
else
{
if (superior != null)
superior.HandleRequest(request);
}
}
}
class BossManager : Manager
{
public override void HandleRequest(string request)
{
if (request == "老板")//代表可以处理该请求,具体条件看具体情况
{
//Do something
}
else
{
if (superior != null)
superior.HandleRequest(request);
}
}
}
3.这样使用起来
只通过leader发起,不用关心具体决策是谁
LeaderManager leader = new LeaderManager();
leader.SetSuperior(new CommonManager());
leader.SetSuperior(new BossManager());
leader.HandleRequest("经理");
总结一哈:
优点:
1.发送请求的人不用关心谁处理
2.链中对象也不用关心自己的结构
3.简化了对象之间的互相连接,大大降低了耦合度
4.可以随时增加或修改一个请求的结构
请求也有可能到了链的末端都得不到处理,需要实现考虑全面。