2009年10月15日星期四

Chain of Responsibility 设计模式

将对事物处理的责任者对象组成一个链,当一个事物要处理的时候,根据事物的属性,能对该事物处理的责任者将事物接受并处理,不能处理的时候,将该对象传递下去,直到遍历所有的责任者。
对公司内采购这个事物,需要主管 或副总裁或总裁的批准,1万元以下的可由主管批准,超过1万的需要由副总裁批准,超过25000的需要由总裁批准。对这个例子,用程序实现如下:

/// Chain of Responsibility 设计模式.
class MainApp
{
static void Main()
{

//建立责任者链
Approver larry = new Director();//主管
Approver sam = new VicePresident();//副总裁
Approver tammy = new President();//总裁
larry.SetSuccessor(sam);//设置主管的上级:副总裁
sam.SetSuccessor(tammy);//设置副总裁的上级总裁。

// 创建购买对象
Purchase p = new Purchase(2034, 350.00, "Supplies");
//将购买对象递交责任链上的主管
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);

Console.ReadKey();
}
}

//责任者(Handler)的抽象基类。
abstract class Approver
{
protected Approver successor;
//设置自己的上级
public void SetSuccessor(Approver successor)
{
this.successor = successor;
}
//批准的处理
public abstract void ProcessRequest(Purchase purchase);
}
//主管类。
class Director : Approver
{
public override void ProcessRequest(Purchase purchase)
{
//购买对象小于10000时,可批准。
if (purchase.Amount < 10000.0)
{

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

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

}
else if (successor != null)//超过1万让上级处理
{

successor.ProcessRequest(purchase);

}
}
}
//副总裁类
class VicePresident : Approver
{
public override void ProcessRequest(Purchase purchase)
{
//购买对象小于25000时,可批准。
if (purchase.Amount < 25000.0)
{
Console.WriteLine("{0} approved request# {1}",
this.GetType().Name, purchase.Number);
}
else if (successor != null)//超过25000时让上级处理。
{
successor.ProcessRequest(purchase);
}
}
}
//总裁类
class President : Approver
{
public override void ProcessRequest(Purchase purchase)
{
//购买对象小于10万时可批准。
if (purchase.Amount < 100000.0)
{
Console.WriteLine("{0} approved request# {1}",
this.GetType().Name, purchase.Number);
}
else//超过10万的购买对象须开会研究决定。
{
Console.WriteLine(
"Request# {0} requires an executive meeting!", purchase.Number);
}
}
}
//购买对象类。
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; }
}
}

执行结果如下:
Director approved request# 2034
President approved request# 2035
Request# 2036 requires an executive meeting!

没有评论:

发表评论