一:定义
职责链模式(Chain of Responsibility):使多个对象都有机会处理这个请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到一个对象处理它为止。
二:优点
将if判断删除,把这些判断放到了子类里,降低了代码的耦合程度.当客户提交一个请求时,请求沿着链传递,一直到某个子类对象负责处理.注意的是职责链要在父类里定义继任者,然后客户段调用的时候给出调用的顺序.
三:代码
abstract class Handler
{
protected Handler successor;
public void SetSuccessor(Handler successor)
{
this.successor = successor;
}
public abstract void HandleRequest(int request); //这里是处理请求的抽象方法
}
class ConcreteHandler1 : Handler //第一种具体处理的方法
{
public override void HandleRequest(int request)
{
if (request >= 0 && request < 10)
{
Console.WriteLine("{0}处理请求{1}", this.GetType().Name, request);
}
else if (successor != null)
{
successor.HandleRequest(request); //如果请求不在0-10之间,且不为空,则转移到下一位,职责链的体现。
}
}
}
class ConcreteHandler2 : Handler
{
public override void HandleRequest(int request)
{
if (request >= 10 && request < 20)
{
Console.WriteLine("{0}处理请求{1}", this.GetType().Name, request);
}
else if (successor != null)
{
successor.HandleRequest(request); //如果请求不在10-20之间,且不为空,则转移到下一位,职责链的体现。
}
}
}
class ConcreteHandler3 : Handler
{
public override void HandleRequest(int request)
{
if (request >= 20)
{
Console.WriteLine("{0}处理请求{1}", this.GetType().Name, request);
}
}
}
static void Main(string[] args)
{
string FileValue = ConfigurationManager.AppSettings["num"]; //根据配置文件key值读取value值
string[] StringArray = FileValue.Split(','); //将字符串按照,号分割
List<Handler> handlerlist = new List<Handler>(); //创建一个Handler类型的list列表
for (int i = 0; i < StringArray.Length; i++) //执行一次添加一个对象
{
handlerlist.Add ( DataAccess.CreteHandler(StringArray[i])); //循环一次就往集合里添加一个对象类
}
handlerlist[0].SetSuccessor(handlerlist[1]);
handlerlist[1].SetSuccessor(handlerlist[2]); //设置了职责链的上下家
int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };
foreach (int request in requests) //从requests这个数组里每次取一个int类型的数
{
handlerlist[0].HandleRequest(request);
}
Console.Read();
}