设计模式(4)一――行为型模式(六)

2014-11-24 02:43:04 · 作者: · 浏览: 6
16.5状态模式
namespace 状态模式
{
class Class2
{
static void Main(string[] args)
{
Context c = new Context(new ConcreteStateA());

c.Request();
c.Request();
c.Request();
c.Request();

Console.Read();

}
}
abstract class State
{
public abstract void Handle(Context context);
}
class ConcreteStateA : State
{

public override void Handle(Context context)
{
context.State = new ConcreteStateB();
}
}
class ConcreteStateB : State
{
public override void Handle(Context context)
{
context.State = new ConcreteStateA();
}
}

class Context
{
private State state;
public Context(State state)
{
this.state = state;
}
public State State
{
get { return state; }
set
{
state = value;
Console.WriteLine("当前状态:"+state.GetType().Name );
}
}
public void Request()
{
state.Handle(this );
}
}
}
//16.5状态模式
namespace 状态模式
{
class Class2
{
static void Main(string[] args)
{
Context c = new Context(new ConcreteStateA());

c.Request();
c.Request();
c.Request();
c.Request();

Console.Read();

}
}
abstract class State
{
public abstract void Handle(Context context);
}
class ConcreteStateA : State
{

public override void Handle(Context context)
{
context.State = new ConcreteStateB();
}
}
class ConcreteStateB : State
{
public override void Handle(Context context)
{
context.State = new ConcreteStateA();
}
}

class Context
{
private State state;
public Context(State state)
{
this.state = state;
}
public State State
{
get { return state; }
set
{
state = value;
Console.WriteLine("当前状态:"+state.GetType().Name );
}
}
public void Request()
{
state.Handle(this );
}
}
}


17. 职责链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它位置。接受者和发送者没有对方的明确信息,链中对象不知道链的结构,他们仅需要保持一个指向后继者的引用(还拿上个状态模式的例子为例,你去求乡长办事,但是这次乡长没有说让你去找书记,而是说行了这事我办吧,你回去吧,而是乡长自己去找得书记,找了书记,书记也解决不了,书记找县长,最后县长给你打电话了说这事你必须得等)


UML图:

\


代码:

view plaincopy to clipboardprint //24.5 加薪代码重构,在客户端让管理者形成链
namespace 职责链模式
{
class Class2
{
static void Main(string[] args)
{
CommonManager jinli = new CommonManager("精力");
Majordomo zongjian = new Majordomo("总见");
GeneralManager zongjingli = new GeneralManager("总警力");
jinli.SetSuperior(zongjian );
zongjian.SetSuperior(zongjingli );

Request request = new Request();
request.RequestType = "请假";
request.RequestContent = "小菜请假";
request.Number = 1;
jinli.RequestApplications(request );

Request request2 = new Request();