📄 chainrealworld.cs
字号:
using System;
using System.Windows.Forms;
using System.Text;
//职责链模式(Chain of Responsibility)
//意图
// 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
// 将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
//适用性
// 1.有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
// 2.你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
// 3.可处理一个请求的对象集合应被动态指定。
namespace DesignPattern.ChainRealWorld
{
class ChainRealWorld : AbstractPattern
{
public static void Run(TextBox tbInfo)
{
s_tbInfo = tbInfo;
s_tbInfo.Text = "";
// Setup Chain of Responsibility
Director Larry = new Director();
VicePresident Sam = new VicePresident();
President Tammy = new President();
Larry.SetSuccessor(Sam);
Sam.SetSuccessor(Tammy);
// Generate and process purchase requests
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);
// Wait for user
////Console.Read();
}
}
// "Handler"
abstract class Approver
{
protected Approver successor;
public void SetSuccessor(Approver successor)
{
this.successor = successor;
}
public abstract void ProcessRequest(Purchase purchase);
}
// "ConcreteHandler"
class Director : Approver
{
public override void ProcessRequest(Purchase purchase)
{
if (purchase.Amount < 10000.0)
{
DesignPattern.FormMain.OutputInfo("{0} approved request# {1}", this.GetType().Name, purchase.Number);
}
else if (successor != null)
{
successor.ProcessRequest(purchase);
}
}
}
// "ConcreteHandler"
class VicePresident : Approver
{
public override void ProcessRequest(Purchase purchase)
{
if (purchase.Amount < 25000.0)
{
DesignPattern.FormMain.OutputInfo("{0} approved request# {1}", this.GetType().Name, purchase.Number);
}
else if (successor != null)
{
successor.ProcessRequest(purchase);
}
}
}
// "ConcreteHandler"
class President : Approver
{
public override void ProcessRequest(Purchase purchase)
{
if (purchase.Amount < 100000.0)
{
DesignPattern.FormMain.OutputInfo("{0} approved request# {1}", this.GetType().Name, purchase.Number);
}
else
{
DesignPattern.FormMain.OutputInfo("Request# {0} requires an executive meeting!", purchase.Number);
}
}
}
// 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;
}
// Properties
public double Amount
{
get
{
return amount;
}
set
{
amount = value;
}
}
public string Purpose
{
get
{
return purpose;
}
set
{
purpose = value;
}
}
public int Number
{
get
{
return number;
}
set
{
number = value;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -