DesignPattern - State
using System;
using System.Web;
//状态模式把研究对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的子类。
//状态模式的意图是让一个对象在其内部状态发生变化的时候其行为也随之改变。
//模式涉及的角色有:
//1、抽象状态:定义一个接口封装环境对象的一个特定状态所对应的行为。
//2、具体状态:每一个具体状态类都实现了环境的一个状态所对应的行为。
//3、环境角色:定义客户端感兴趣的接口,并且保留一个具体状态类的实例这个实例给出此环境对象的现有状态。
//在什么情况下使用状态模式
//1、对象的行为依赖于它所处的状态
//2、对象在某个方法里依赖于一重或多重的条件转移语句,其中有大量的条件判断代码。
//状态模式实现的讨论
//1、状态模式并没有规定哪个角色决定状态发生转换的条件如果转换条件是固定的则状态转换由Context来做
//2、但是如果由State子类自己来决定下一继任者是谁则系统将更有灵活性。
//3、或者由外界事件来决定状态的转变。
//状态对象的创建
//1、需要的时候创建,使用完毕立即消去。
//2、事先创建所有的状态对象。
public partial class DesignPattern_State : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
RequestLead request = new RequestLead(new LeaderHappy());
Response.Write("<br><br>刚上班,领导心情很好");
request.Request();
Response.Write("<br><br>做了一些事开始不爽了");
request.leader = new LeaderNotBad();
request.Request();
Response.Write("<br><br>事越来越多,做烦了");
request.leader = new LeaderWorry();
request.Request();
}
}
public class RequestLead
{
public ILeader leader;
public void Request()
{
leader.PlayGirl();
leader.DoWork();
leader.HelpMe();
}
public RequestLead(ILeader leader)
{
this.leader = leader;
}
}
//请求领导做某些事
public interface ILeader
{
void PlayGirl();//出去玩小姐
void DoWork();//干正事
void HelpMe();//帮忙
}
public class LeaderHappy : ILeader
{
public void PlayGirl()
{
HttpContext.Current.Response.Write("<br>放屁,我是那样的人吗,我正做正经事呢");
}
public void DoWork()
{
HttpContext.Current.Response.Write("<br>这不是正拼命在做着吗");
}
public void HelpMe()
{
HttpContext.Current.Response.Write("<br>好,你说,什么事");
}
}
public class LeaderNotBad : ILeader
{
public void PlayGirl()
{
HttpContext.Current.Response.Write("<br>先不想这事,怕老婆知道");
}
public void DoWork()
{
HttpContext.Current.Response.Write("<br>做着呢,,还一大堆等着");
}
public void HelpMe()
{
HttpContext.Current.Response.Write("<br>等着吧,等我研究研究后给你办");
}
}
public class LeaderWorry : ILeader
{
public void PlayGirl()
{
HttpContext.Current.Response.Write("<br>走,玩去,散散心");
}
public void DoWork()
{
HttpContext.Current.Response.Write("<br>做个JB,烦着呢");
}
public void HelpMe()
{
HttpContext.Current.Response.Write("<br>死一边去,没看我烦着吗");
}
}