职责链(Chain of Responsibility)模式
2013-07-30 19:40
176 查看
一、职责链(Chainof Responsibility)模式
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
二、 责任链模式的结构
责任链模式涉及到的角色如下所示:
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
模式理解图:
示例源代码:
结果截图:
类图:
关系图:
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
二、 责任链模式的结构
责任链模式涉及到的角色如下所示:
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
模式理解图:
示例源代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Chain_of_Responsibility { abstract class Handler { protected Handler successor; public void setSuccessor(Handler successor) { this.successor = successor; } abstract public void HandleRequest(int request); } //ConcreteHandler1 class ConcreteHandler1 : Handler { override public void HandleRequest(int request) { if (request >= 0 && request < 10) { Console.WriteLine("{0} handled request {1}", this, request); } else if (successor != null) successor.HandleRequest(request); } } class ConcreteHandler2 : Handler { public override void HandleRequest(int request) { //throw new NotImplementedException(); if (request >= 10 && request < 20) Console.WriteLine("{0} handled request {1}", this, request); else if (successor != null) successor.HandleRequest(request); } } class ConcreteHandler3 : Handler { public override void HandleRequest(int request) { //throw new NotImplementedException(); if (request >= 20 && request < 30) { Console.WriteLine("{0} handled request {1}", this, request); } else if (successor != null) { successor.HandleRequest(request); } } } class Program { static void Main(string[] args) { Handler h1 = new ConcreteHandler1(); Handler h2 = new ConcreteHandler2(); Handler h3 = new ConcreteHandler3(); h1.setSuccessor(h2); h2.setSuccessor(h3); h3.setSuccessor(h1); //像一条链路,每个对象都有对下一个对象的引用。 int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 }; foreach (int request in requests) h1.HandleRequest(request); Console.ReadKey(); } } }
结果截图:
类图:
关系图:
相关文章推荐
- 职责链模式(Chain of Responsibility)
- atitit.(设计模式1)--—职责链(chain of responsibility)最佳实践O7 转换日期
- 职责链模式(Chain of Responsibility)(对象行为型)
- 设计模式学习笔记(十九)—Chain of Responsibility职责链模式
- 行为模式:Chain Of Responsibility(职责链)
- 设计模式之职责链模式(Chain of Responsibility)
- 职责链(Chain of Responsibility)模式在航空货运中的运用实例
- 设计模式--Chain Of Responsibility 职责链模式
- 设计模式之职责链(Chain Of Responsibility)
- 设计模式之Chain of Responsibility(职责链)
- 重温设计模式(三)——职责链模式(chain of responsibility)
- 设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为
- 职责链模式(Chain of Responsibility)
- Chain of Responsibility 职责链模式
- C++设计模式实现--职责链(Chain of Responsibility)模式
- 职责链模式(Chain of Responsibility)的Java实现
- 设计模式学习笔记之-职责链模式CHAIN OF RESPONSIBILITY
- Chain of Responsibility(职责链模式)
- 设计模式:行为模式:职责链(chain of responsibility)
- 研磨设计模式 之 职责链模式(Chain of Responsibility)3??跟着cc学设计系列