设计模式之责任链模式

定义:使用多个类而不是一个去传递请求,可以很大程度上降低请求的发出者与接受者之间的耦合。多个类成链式,去接受请求,在请求的接受者接受之前传递请求。

UML图:

类:

  Handler: 定义处理请求的接口

  ConcreteHandler:1:处理请求

                          2:获取下一个链接者

                          3:如果这个类可以处理请求,处理;否则传递给下一个链接者。

  Client: 初始化请求,发送请求。

 

用C#写的小例子:

 

using System;

namespace DoFactory.GangOfFour.Chain.Structural

{

/// <summary>

/// 责任链设计模式

/// </summary>

class MainApp

{

/// <summary>

/// 程序入口点

/// </summary>

static void Main()

{

// 新建责任链

Handler h1 = new ConcreteHandler1();

Handler h2 = new ConcreteHandler2();

Handler h3 = new ConcreteHandler3();

h1.SetSuccessor(h2);

h2.SetSuccessor(h3);

// 初始化请求

int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };

foreach (int request in requests)

{

h1.HandleRequest(request);

}

// 等待

Console.ReadKey();

}

}

/// <summary>

/// 'Handler'接口或抽象类

/// </summary>

abstract class Handler

{

protected Handler successor;

public void SetSuccessor(Handler successor)

{

this.successor = successor;

}

public abstract void HandleRequest(int request);

}

/// <summary>

///'ConcreteHandler1' 类

/// </summary>

class ConcreteHandler1 : Handler

{

public override void HandleRequest(int request)

{

if (request >= 0 && request < 10)

{

Console.WriteLine("{0} handled request {1}",

this.GetType().Name, request);

}

else if (successor != null)

{

successor.HandleRequest(request);

}

}

}

/// <summary>

/// The 'ConcreteHandler2' class

/// </summary>

class ConcreteHandler2 : Handler

{

public override void HandleRequest(int request)

{

if (request >= 10 && request < 20)

{

Console.WriteLine("{0} handled request {1}",

this.GetType().Name, request);

}

else if (successor != null)

{

successor.HandleRequest(request);

}

}

}

/// <summary>

/// The 'ConcreteHandler3' class

/// </summary>

class ConcreteHandler3 : Handler

{

public override void HandleRequest(int request)

{

if (request >= 20 && request < 30)

{

Console.WriteLine("{0} handled request {1}",

this.GetType().Name, request);

}

else if (successor != null)

{

successor.HandleRequest(request);

}

}

}

}

 

 现实点的例子

using System;

namespace DoFactory.GangOfFour.Chain.RealWorld

{

/// <summary>

/// MainApp startup class for Real-World

/// Chain of Responsibility Design Pattern.

/// </summary>

class MainApp

{

/// <summary>

/// Entry point into console application.

/// </summary>

static void Main()

{

// Setup Chain of Responsibility

Approver larry = new Director();

Approver sam = new VicePresident();

Approver tammy = new President();

larry.SetSuccessor(sam);

sam.SetSuccessor(tammy);

// Generate and process purchase requests

Purchase p = new Purchase(2034, 350.00, "Assets");

larry.ProcessRequest(p);

p = new Purchase(2035, 32590.10, "Project X");

larry.ProcessRequest(p);

p = new Purchase(2036, 122100.00, "Project Y");

larry.ProcessRequest(p);

// Wait for user

Console.ReadKey();

}

}

/// <summary>

/// The 'Handler' abstract class

/// </summary>

abstract class Approver

{

protected Approver successor;

public void SetSuccessor(Approver successor)

{

this.successor = successor;

}

public abstract void ProcessRequest(Purchase purchase);

}

/// <summary>

/// The 'ConcreteHandler' class

/// </summary>

class Director : Approver

{

public override void ProcessRequest(Purchase purchase)

{

if (purchase.Amount < 10000.0)

{

Console.WriteLine("{0} approved request# {1}",

this.GetType().Name, purchase.Number);

}

else if (successor != null)

{

successor.ProcessRequest(purchase);

}

}

}

/// <summary>

/// The 'ConcreteHandler' class

/// </summary>

class VicePresident : Approver

{

public override void ProcessRequest(Purchase purchase)

{

if (purchase.Amount < 25000.0)

{

Console.WriteLine("{0} approved request# {1}",

this.GetType().Name, purchase.Number);

}

else if (successor != null)

{

successor.ProcessRequest(purchase);

}

}

}

/// <summary>

/// The 'ConcreteHandler' class

/// </summary>

class President : Approver

{

public override void ProcessRequest(Purchase purchase)

{

if (purchase.Amount < 100000.0)

{

Console.WriteLine("{0} approved request# {1}",

this.GetType().Name, purchase.Number);

}

else

{

Console.WriteLine(

"Request# {0} requires an executive meeting!",

purchase.Number);

}

}

}

/// <summary>

/// Class holding request details

/// </summary>

class Purchase

{

private int _number;

private double _amount;

private string _purpose;

// Constructor

public Purchase(int number, double amount, string purpose)

{

this._number = number;

this._amount = amount;

this._purpose = purpose;

}

// Gets or sets purchase number

public int Number

{

get { return _number; }

set { _number = value; }

}

// Gets or sets purchase amount

public double Amount

{

get { return _amount; }

set { _amount = value; }

}

// Gets or sets purchase purpose

public string Purpose

{

get { return _purpose; }

set { _purpose = value; }

}

}

}

 

时间: 2024-11-01 17:14:46

设计模式之责任链模式的相关文章

乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) 作者:webabcd 介绍 为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它. 示例 有一个Message实体类,某个类对它的操作有Insert()方法.现在要求根据插

详解java设计模式之责任链模式

从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正.开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒. 假比说,贾母.贾赦.贾政.贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链.击鼓者将花传给贾母,开始传花游戏.花由贾母传给贾赦,由贾赦传给贾政,由贾政传给贾宝玉,又由贾宝玉传给贾环,由贾环传回给贾母,如此往复(见下图).当鼓声停止时,手中有花的人就得执行酒令. 图1.击鼓传

PHP设计模式之责任链模式的深入解析_php技巧

责任链模式,其目的是组织一个对象链处理一个如方法调用的请求.当ConcreteHandler(具体的处理程序)不知道如何满足来自Client的请求时,或它的目的不是这个时,它会委派给链中的下一个Handler(处理程序)来处理. 这个设计模式通常和复合模式一起使用,其中有些叶子或容器对象默认委派操作给它们的父对象.另一个例子是,本地化通常是使用责任链处理的,当德语翻译适配器没有为翻译关键词找到合适的结果时,就返回到英语适配器或干脆直接显示关键词本身. 耦合减少到最低限度:Client类不知道由哪

设计模式:责任链模式(Chain of Responsibility)

 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止. 责任链模式的角色: 1. 抽象处理者角色(Handler):定义出一个处理请求的接口.如果需要,接口可以定义出一个方法以设定和返回对下家的引用.这个角色通常由一个Java抽象类或者Java接口实现.上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handlerRequest()规范了子类处理请求的操作. 2. 具体处理者角色(Co

Java设计模式之责任链模式简介_java

对于使用过宏的朋友应该知道,利用宏可以实现一个键绑定多个技能.例如如果排在前面的技能有CD,则跳过此技能,执行之后的技能.记得曾经玩DK,打怪的时候,就是用一个键,一直按就行了.在servlet里的doGet和doPost方法,我们一般都把doGet请求发动到doPost里来处理,这也是一种责任链的模式. 这里,有个宏,绑定了"冰血冷脉"和"寒冰箭"两个技能,程序实例如下所示: package responsibility; /** * DOC 技能接口,要绑定的技

学习JavaScript设计模式之责任链模式_javascript技巧

一.定义 责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 二.示例 假设这么一个场景: 我们负责一个售卖手机的电商网站,经过分别缴纳500元定金和200元定金的两轮预定后,到了正式购买阶段.针对预定用户实行优惠,支付过500元定金的用户会收到100元的商城优惠券,支付过200元定金的用户会收到50元的商城优惠券,没有支付定金的用户归为普通购买,且在库存有限的情况下不一定保证买到. /*

Head First设计模式之责任链模式

一.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了. 何时使用:在处理消息的时候以过滤很多道. 如何解决:拦截的类都实现统一接口. 二.结构  从责任链模式的定义可以发现,责任链模式涉及的对象只有处理者角色,但由于有多个处理者,它们具有共同的处理请求

跟屌丝学设计模式之责任链模式

JAVA之责任链模式 原文地址:http://itzyx.com/index.php/java_zrl/ 在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的:  责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和

Java设计模式之责任链模式(Chain of Responsibility模式)介绍_java

Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request.也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去. 如何使用责任链模式虽然这一段是如何使用CoR,但是也是演示什么是CoR. 有一个Handler接口: 复制代码

JAVA设计模式之责任链模式详解_java

在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任. 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位置,由一人击鼓,击鼓