Core Design Patterns(16) Chain of Responsibility 职责链模式
VS 2008
多个对象构成一个链式结构,客户端向链中的某个对象发出请求,被请求的对象可以处理客户代码的请求,也可以根据业务将请求向下传递,依此类推,直到请求最终被某对象处理,或抛出异常。这就是职责链模式的应用场景。
1. 模式UML图
![](/images/cnblogs_com/guozhijian/Design Pattern/chain-1.gif)
2. 代码示例
例子仅为演示职责链模式。
软件从业人员,可能分SE, SSE, PL, PM等不同级别,有些工作可能按工作性质需要不同级别的人员才能处理,对于自己不能处理的工作,那么,他需要将请求传递给下家。
![](/images/cnblogs_com/guozhijian/Design Pattern/chain-2.gif)
IWorker.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.ChainOfResponsibility.BLL {
![](/Images/OutliningIndicators/InBlock.gif)
public interface IWorker {
![](/Images/OutliningIndicators/InBlock.gif)
void DoWork(int level);
}
}
SE.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.ChainOfResponsibility.BLL {
public class SE : IWorker {
![](/Images/OutliningIndicators/InBlock.gif)
private IWorker next;
![](/Images/OutliningIndicators/InBlock.gif)
public SE(IWorker next) {
this.next = next;
}
![](/Images/OutliningIndicators/InBlock.gif)
IWorker Members
}
}
SSE.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.ChainOfResponsibility.BLL {
public class SSE : IWorker {
![](/Images/OutliningIndicators/InBlock.gif)
private IWorker next;
![](/Images/OutliningIndicators/InBlock.gif)
public SSE(IWorker next) {
this.next = next;
}
![](/Images/OutliningIndicators/InBlock.gif)
IWorker Members
}
}
PL.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.ChainOfResponsibility.BLL {
public class PL : IWorker {
![](/Images/OutliningIndicators/InBlock.gif)
private IWorker next;
![](/Images/OutliningIndicators/InBlock.gif)
public PL(IWorker next) {
this.next = next;
}
![](/Images/OutliningIndicators/InBlock.gif)
IWorker Members
}
}
PM.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.ChainOfResponsibility.BLL {
public class PM : IWorker {
![](/Images/OutliningIndicators/InBlock.gif)
private IWorker next;
![](/Images/OutliningIndicators/InBlock.gif)
public PM(IWorker next) {
this.next = next;
}
![](/Images/OutliningIndicators/InBlock.gif)
IWorker Members
}
}
Client
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DesignPattern.ChainOfResponsibility.BLL;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.ChainOfResponsibility {
class Program {
static void Main(string[] args) {
![](/Images/OutliningIndicators/InBlock.gif)
IWorker worker = new SE(new SSE(new PL(new PM(null))));
worker.DoWork(3);
}
}
}
Output
多个对象构成一个链式结构,客户端向链中的某个对象发出请求,被请求的对象可以处理客户代码的请求,也可以根据业务将请求向下传递,依此类推,直到请求最终被某对象处理,或抛出异常。这就是职责链模式的应用场景。
1. 模式UML图
![](/images/cnblogs_com/guozhijian/Design Pattern/chain-1.gif)
2. 代码示例
例子仅为演示职责链模式。
软件从业人员,可能分SE, SSE, PL, PM等不同级别,有些工作可能按工作性质需要不同级别的人员才能处理,对于自己不能处理的工作,那么,他需要将请求传递给下家。
![](/images/cnblogs_com/guozhijian/Design Pattern/chain-2.gif)
IWorker.cs
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
SE.cs
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
SSE.cs
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
PL.cs
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
PM.cs
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
Client
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
Output
![](/images/cnblogs_com/guozhijian/Design Pattern/chain-3.gif)