设计模式系列-状态模式
第一步:首先能我参观了五处景点,先将五处景点定义一个枚举类型,代码如下:/// <summary>
/// 故宫景点
/// </summary>
enum ImperialPalaceEnum
{
太和殿,
乾清宫,
御花园,
东六宫,
九龙壁
}
第二步:实现我每参观一处景点心里状态的变化,代码如下:
/// <summary>
/// 故宫参观类
/// </summary>
public class IPVisit
{
/// <summary>
/// 当前地点
/// </summary>
private ImperialPalaceEnum ipCurrentSpot;
public ImperialPalaceEnum IpCurrentSpot
{
set
{
ipCurrentSpot = value;
}
}
/// <summary>
/// 体会感受景点
/// </summary>
public void ExperienceSpot()
{
//体会感受当前景点
switch (ipCurrentSpot)
{
case ImperialPalaceEnum.太和殿:
Console.WriteLine("太和殿:皇上的家的客厅真的宏伟气派啊,脑海中幻想着当时举行大型仪式的情景甚是激动!");
break;
case ImperialPalaceEnum.乾清宫:
Console.WriteLine("乾清宫:是不是因为养心殿距离后宫很近雍正才搬过去的呀?");
break;
case ImperialPalaceEnum.御花园:
Console.WriteLine("御花园:御花园真的没有想象中的漂亮啊,很是失落.");
break;
case ImperialPalaceEnum.东六宫:
Console.WriteLine("东六宫:已经看不出当年嫔妃们生活的环境了,成展馆了.");
break;
case ImperialPalaceEnum.九龙壁:
Console.WriteLine("九龙壁:在宫中混,不会点三十六计都没脸见人.");
break;
}
}
第三步:主函数调用代码如下:
IPVisit visit = new IPVisit();
visit.IpCurrentSpot = ImperialPalaceEnum.太和殿;
visit.ExperienceSpot();
visit.IpCurrentSpot = ImperialPalaceEnum.乾清宫;
visit.ExperienceSpot();
visit.IpCurrentSpot = ImperialPalaceEnum.御花园;
visit.ExperienceSpot();
visit.IpCurrentSpot = ImperialPalaceEnum.东六宫;
visit.ExperienceSpot();
visit.IpCurrentSpot = ImperialPalaceEnum.九龙壁;
visit.ExperienceSpot();
运行结果为:
1 太和殿:皇上的家的客厅真的宏伟气派啊,脑海中幻想着当时举行大型仪式的情景甚是激动!
2 乾清宫:是不是因为养心殿距离后宫很近雍正才搬过去的呀?
3 御花园:御花园真的没有想象中的漂亮啊,很是失落.
4 东六宫:已经看不出当年嫔妃们生活的环境了,成展馆了.
5 九龙壁:在宫中混,不会点三十六计都没脸见人.
6 请按任意键继续. . .
二、状态模式
分析上边的代码我们会发现,参观故宫IPVisit的对象的行为取决于它的状态,例如:ipCurrentEnum属性等于不同的属性值时,体会景点方法:ExperienceSpot所做的行为就会不同。这样一来首先就会导致我们一个方法出现了不同的职责,如果一个这个方法的责任过多那么维护起来必然是头疼的,例如看上边场景代码中的第二步中的代码,switch中的每一个case与break之间都实现了一种状态的行为。那么这个时候如果新增了一个景点(状态)就要修改此处的代码,导致违背了"开放-封闭原则"。这时有人就会说了,我们有的时候需求没有那么复杂我觉得用switch这样实现就很好,既简单又明了,这点我也非常赞同,设计就是根据实际需求来订的量身定做的设计才是最好的设计。话说的有点远了,那么如何优化我们上面的代码,使它可以灵活的扩展状态降低复杂度呢?不必担心,设计模式四人帮的前辈们已经在这类问题上给出了一个完美的解决方案,状态模式隆重登场!
1、什么是状态模式?
设计模式一书中的定义为:当一个对象在其内部状态改变时改变它的行为,对象看起来好像是修改其类。
2、状态模式类图
Context:维护一个状态的实例,这个实例定义的是当前的状态。
State: 该接口抽象Context一个特定状态的相关行为。
ConcreteState:实现了Context具体状态的行为。
3、状态模式代码实现
Context类用来维护一个当前状态的实例,表示当前状态,代码如下:
/// <summary>
/// 维护了当前状态的主体
/// </summary>
public class Context
{
public Context() { }
public Context(State state)
{
this.currentState = state;
}
private State currentState;
public State CurrentState
{
set
{
currentState = value;
}
}
/// <summary>
/// 执行当前状态
/// </summary>
public void Request()
{
currentState.Handle(this);
}
State接口:Context所需状态行为的抽象。代码如下:
public interface State
{
void Handle(Context context);
}
ConcreteState类:根据State的抽象实现了Context所需状态行为的实例,代码如下:
/// <summary>
/// 执行该状态对应的行为,设置下一个状态实例
/// </summary>
public class ConcereteStateA : State
{
public void Handle(Context context
补充:软件开发 , Java ,
上一个:缓冲器(Buffer)的细节
下一个:Java的日期API真烂
- 更多JAVA疑问解答:
- java怎么在线读取ftp服务器上的文件内容
- 关于程序员的职业规划
- HTML和JSP矛盾吗?
- java小程序如何打包?
- java怎么split路径文件名?
- 关于Hibernate实体自身多对一的抓取问题
- 关于apache2+tomcat群集出现的问题
- SSH 导入导出excel 谁有这块的资料吗?
- springmvc 加载一个jsp页面执行多个方法 报404
- 关于用jquery 导入 excel
- java对时间进行循环放到List中
- 一个图片的输入输出程序,第一次调用某方法会中断,第二次调用则正常
- 请上过传智播客的人说一下传智播客怎么样呀!是不是像它说的那样好呀!
- spring的schema怎么配置
- 【菜鸟求助】SSH中怎么从JSP页面往后台传值呢