職責鏈模式 Chain of Responbility
示例代碼
namespace ChainOfResponsibility
{
public class PurchaseRequest
{
private double amount;
public double Amount
{
get { return amount; }
set { amount = value; }
}
private string purpose;
public string Purpose
{
get { return purpose; }
set { purpose = value; }
}
public PurchaseRequest(double amount, string purpose)
{
this.amount = amount;
this.purpose = purpose;
}
}
}
namespace ChainOfResponsibility
{
class ManagerPPower : PurchasePower
{
private const double ALLOWABLE = 20 * BASE;
public override void ProcessRequest(PurchaseRequest request)
{
if (request.Amount < ALLOWABLE)
{
Console.WriteLine("Manager will approve $" + request.Amount);
}
else if (successor != null)
{
successor.ProcessRequest(request);
}
}
}
}
namespace ChainOfResponsibility
{
class ManagerPPower : PurchasePower
{
private const double ALLOWABLE = 20 * BASE;
public override void ProcessRequest(PurchaseRequest request)
{
if (request.Amount < ALLOWABLE)
{
Console.WriteLine("Manager will approve $" + request.Amount);
}
else if (successor != null)
{
successor.ProcessRequest(request);
}
}
}
}
namespace ChainOfResponsibility
{
public abstract class PurchasePower
{
protected const double BASE = 500;
protected PurchasePower successor;
public void SetSuccessor(PurchasePower successor)
{
this.successor = successor;
}
public abstract void ProcessRequest(PurchaseRequest request);
}
}
namespace ChainOfResponsibility
{
class ManagerPPower : PurchasePower
{
private const double ALLOWABLE = 20 * BASE;
public override void ProcessRequest(PurchaseRequest request)
{
if (request.Amount < ALLOWABLE)
{
Console.WriteLine("Manager will approve $" + request.Amount);
}
else if (successor != null)
{
successor.ProcessRequest(request);
}
}
}
}
namespace ChainOfResponsibility
{
public class DirectorPPower : PurchasePower
{
private const double ALLOWABLE = 20 * BASE;
public override void ProcessRequest(PurchaseRequest request)
{
if (request.Amount < ALLOWABLE)
{
Console.WriteLine("Director will approve $" + request.Amount);
}
else if (successor != null)
{
successor.ProcessRequest(request);
}
}
}
}
namespace ChainOfResponsibility
{
public class PresidentPPower : PurchasePower
{
private const double ALLOWABLE = 60 * BASE;
public override void ProcessRequest(PurchaseRequest request)
{
if (request.Amount < ALLOWABLE)
{
Console.WriteLine("President will approve $" + request.Amount);
}
else
{
Console.WriteLine("Your request for $" + request.Amount + " needs a board meeting!");
}
}
}
}
namespace ChainOfResponsibility
{
public class VicePresidentPPower : PurchasePower
{
private const double ALLOWABLE = 40 * BASE;
public override void ProcessRequest(PurchaseRequest request)
{
if (request.Amount < ALLOWABLE)
{
Console.WriteLine("Vice President will approve $" + request.Amount);
}
else if (successor != null)
{
successor.ProcessRequest(request);
}
}
}
}
namespace ChainOfResponsibility
{
class Program
{
static void Main(string[] args)
{
ManagerPPower manager = new ManagerPPower();
DirectorPPower director = new DirectorPPower();
VicePresidentPPower vp = new VicePresidentPPower();
PresidentPPower president = new PresidentPPower();
manager.SetSuccessor(director);
director.SetSuccessor(vp);
vp.SetSuccessor(president);
try
{
while (true)
{
Console.WriteLine("Enter the amount to check who should approve your expenditure.");
Console.Write(">");
double d = Double.Parse(Console.ReadLine());
manager.ProcessRequest(new PurchaseRequest(d, "General"));
}
}
catch (Exception e)
{
Environment.Exit(1);
}
}
}
}
迭代器模式 Iterator