[设计模式]责任链模式

2008年05月25日 6:43 下午  |  分类:Develop

责任链模式属于行为型设计模式中的一种。
责任链模式避免将发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并沿着这条链传递请求,直到有对象处理为止。


Handler:传递者接口,定义一个处理请求的接口;实现链中下一个对象(可选)
ConcreteHandler:具体传递者,处理它所负责的请求;可以访问链中下一个对象,如果可以处理请求就处理它,否则将请求传递给下一个对象。
Client:客户端应用程序。

实际生活中的例子:
员工请假,部门经理可以批3天以下的假期,中心总监可批5天以下的假期,副总裁可批10天以下的假期,CEO可以批20天以下假期,超过20天需要开会决定。
示例:

// "Handler"
//传递者抽象类
abstract class Handler
{
protected Handler successor; //维护它的下一个处理对象

public void SetSuccessor(Handler successor)
{
this.successor = successor;
}
//处理方法
public abstract void HandleRequest(int request);
}

具体传递者

// 部门经理

class ConcreteHandler1 : Handler
{
public override void HandleRequest(int request)
{
if (request >= 0 && request <= 3)
{
Console.WriteLine(" {1} 天假期已由部门经理批示",
this.GetType().Name, request);
}
else if (successor != null)
{
successor.HandleRequest(request);
}
}
}

// 中心总监

class ConcreteHandler2 : Handler
{
public override void HandleRequest(int request)
{
if (request >= 4 && request < 6)
{
Console.WriteLine(" {1} 天假期已由中心总监批示",
this.GetType().Name, request);
}
else if (successor != null)
{
successor.HandleRequest(request);
}
}
}

//副总裁

class ConcreteHandler3 : Handler
{
public override void HandleRequest(int request)
{
if (request >=6 && request < 11)
{
Console.WriteLine(" {1} 天假期已由副总裁批示",
this.GetType().Name, request);
}
else if (successor != null)
{
successor.HandleRequest(request);
}
}
}
//CEO
class ConcreteHandler4 : Handler
{
public override void HandleRequest(int request)
{
if (request >= 11 && request < 21)
{
Console.WriteLine(" {1} 天假期已由CEO批示",
this.GetType().Name, request);
}
else if (successor != null)
{
successor.HandleRequest(request);
}
}
}
//开会决定
class ConcreteHandler5 : Handler
{
public override void HandleRequest(int request)
{
if (request >= 21)
{
Console.WriteLine(" {1} 天假期需要开会决定",
this.GetType().Name, request);
}
else if (successor != null)
{
successor.HandleRequest(request);
}
}
}

客户端调用

static void Main()
{

Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3();
Handler h4 = new ConcreteHandler4();
Handler h5 = new ConcreteHandler5();
h1.SetSuccessor(h2);
h2.SetSuccessor(h3);
h3.SetSuccessor(h4);
h4.SetSuccessor(h5);

int[] requests = { 2, 5, 14, 22 };

foreach (int request in requests)
{
h1.HandleRequest(request);
}

Console.Read();
}

执行结果:

策略模式

2008年05月13日 3:29 下午  |  分类:Develop

Strategy策略模式是属于设计模式中对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类.
它的UML图


Strategy是一个策略类,其中定义一个或多个算法接口
ConcreteStrategy是实现算法接口的具体策略类
Context是上下文应用

比如,我要从龙阳路去浦东国际机场,我可以选择坐公交、可以选择打车、可以选择坐磁悬浮。
这里的乘车方式就是一个可变的,因此独立为一接口
如策略接口

public interface IToAerodrome
{
void ToDo();
}

实现该接口(算法)的具体类

public class ByBus : IToAerodrome
{
#region IToAerodrome 成员

public void ToDo()
{
Console.WriteLine("乘坐公交车去机场");
}

#endregion
}
public class ByTaxi : IToAerodrome
{
#region IToAerodrome 成员

public void ToDo()
{
Console.WriteLine("我乘坐出租车去机场");
}

#endregion
}

public class ByTrain : IToAerodrome
{
#region IToAerodrome 成员

public void ToDo()
{
Console.WriteLine("坐每小时200公里的磁悬浮");
}

#endregion
}


public class ToAerodromeStrategy
{
IToAerodrome _ToAerodrome;
/// <summary>
/// 构造函数,以实现IToAerodrome的类实体为参数
/// </summary>
/// <param name="toAerodrome"></param>
public ToAerodromeStrategy(IToAerodrome toAerodrome)
{
_ToAerodrome = toAerodrome;
}

/// <summary>
/// 改变当前的策略
/// </summary>
/// <param name="toAerodrome"></param>
public void ChangeStrategy(IToAerodrome toAerodrome)
{
_ToAerodrome = toAerodrome;
}

/// <summary>
/// 执行方法
/// </summary>
public void Go()
{
_ToAerodrome.ToDo();
}
}

context

static void Main(string[] args)
{
ToAerodromeStrategy to = new ToAerodromeStrategy(new ByBus());
to.Go();
Console.WriteLine("我要改坐磁悬浮");
to.ChangeStrategy(new ByTrain());
to.Go();
Console.Read();
}

执行结果