一:定义
职责链模式(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(); }