设计模式------责任链模式(chain of responsbility)
基本职能: 就是使多个对象都可以处理请求,避免请求发送者与接收者之间更多的耦合关系。将接收者串成一条链,将请求延一个方向顺序递送,直到有接收者处理他。
Rose中相关的UML图如下:
应用地方: 1. 多个对象处理一个请求,多个对象在运行时指定。 2. 在不明确接收者的情况下递交多个请求。 3. 运行时判断拿一个接收者处理这个请求。
实例: 1.自动售货机,自动辨认1元,5毛,1毛的硬币。 C#语言实现 CoinData.cs using System;
namespace ChianOfResponsibility { public class CoinData { private bool m_Succeed; private int m_nValue;
public CoinData(int nValue) { m_nValue=nValue; }
public int Value { get { return m_nValue; } }
public bool Succeed { get { return m_Succeed; } set { m_Succeed=value; } }
public override string ToString() { return "Coin:"+Value; } } }
Coin10.cs using System;
namespace ChianOfResponsibility {
public class Coin10:IHandler { public Coin10() {
}
public CoinData CoinValue(CoinData data) { data.Succeed=(data.Value==10); return data; } } }
Coin100.cs namespace ChianOfResponsibility {
public class Coin100:IHandler { public Coin100() {
}
public CoinData CoinValue(CoinData data) { data.Succeed=(data.Value==100); return data; } } }
Coin50.cs namespace ChianOfResponsibility { public class Coin50:IHandler { public Coin50() {
}
public CoinData CoinValue(CoinData data) { data.Succeed=(data.Value==50); return data; } }
} CoinChain.cs
namespace ChianOfResponsibility { public class CoinChain { private CoinChain() {
}
private static IHandler[] m_handlers= { new Coin100(), new Coin10(),new Coin50() };
public static CoinData Solve(CoinData dt) { foreach(IHandler h in m_handlers) { CoinData ret=h.CoinValue(dt); if(ret.Succeed) { return ret; } } throw new ApplicationException("Not such coin."); } } }
IHandler.cs
namespace ChianOfResponsibility { interface IHandler { CoinData CoinValue(CoinData data); } }
TestClass.cs using System;
namespace ChianOfResponsibility {
class TestClass { [STAThread] static void Main(string[] args) { CoinData dt=new CoinData(100); Console.WriteLine(CoinChain.Solve(dt)); dt=new CoinData(10); Console.WriteLine(CoinChain.Solve(dt)); dt=new CoinData(50); Console.WriteLine(CoinChain.Solve(dt)); dt=new CoinData(30); Console.WriteLine(CoinChain.Solve(dt)); } } } |