天天看点

设计模式之责任链模式

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

uml图:

设计模式之责任链模式

类:

  handler: 定义处理请求的接口

  concretehandler:1:处理请求

                          2:获取下一个链接者

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

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

用c#写的小例子:

using system;

namespace dofactory.gangoffour.chain.structural

{

/// <summary>

/// 责任链设计模式

/// </summary>

class mainapp

/// 程序入口点

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();

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

abstract class handler

protected handler successor;

public void setsuccessor(handler successor)

this.successor = successor;

public abstract void handlerequest(int request);

///'concretehandler1' 类

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);

/// the 'concretehandler2' class

class concretehandler2 : handler

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

/// the 'concretehandler3' class

class concretehandler3 : handler

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

 现实点的例子

namespace dofactory.gangoffour.chain.realworld

/// mainapp startup class for real-world

/// chain of responsibility design pattern.

/// entry point into console application.

// 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");

p = new purchase(2036, 122100.00, "project y");

// wait for user

/// the 'handler' abstract class

abstract class approver

protected approver successor;

public void setsuccessor(approver successor)

public abstract void processrequest(purchase purchase);

/// the 'concretehandler' class

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);

successor.processrequest(purchase);

class vicepresident : approver

if (purchase.amount < 25000.0)

class president : approver

if (purchase.amount < 100000.0)

else

console.writeline(

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

purchase.number);

/// class holding request details

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; }