状态模式之看尽人生百态
有人说“人的起点起初都是一样的。在后来的加加减减中。慢慢出现了差距……”人生是什么?人生如你脚下的路,如但丁在《神曲》里的一句话“在人生旅程的中途……”不论以前做对了什么,做错了什么。用一颗心、一生情去坚定走你没走完的路。人生是什么?是一幅优美的画卷,是一段离奇的爱情故事,还是一曲悠悠的伤感乐曲……我无法形容人生是什么,为什么会有各式各样的人生经历,有人哭有人笑。有人淡然。有人超然,细看人间故事,品酸甜苦辣。
每一个人的人生宛如一个个小小的圆圈,随着时间的推移。这个圆慢慢的慢慢的长大,圆里面是一个过程。纷繁复杂着那一段一段的经历。
从童年開始。一直到老年落幕,我们都一直在人生的舞台上尽情演绎自己的故事。今天我们的设计模式就从人生開始说起。人生有着五个明白的阶段,从童年,少年。青年。中年。一直到老年落幕,也能够这么说,人的一生分为五个状态。宛如我们设计模式中的状态模式,首先我们来看一下状态模式的结构图:
以我们的人生为例,看看状态模式是怎样活跃着我们人生的舞台:
首先抽象状态类-----抽象类 LifeState
//定义一个抽象的LifeState类
public abstract class LifeState
{
public abstract void ChangeLife(Life l);
}
详细的人生阶段
//童年阶段-ChildhoodState
class ChildhoodState: LifeState
{
public override void ChangeLife(Life l)
{
Console.WriteLine("童年是一片无边无际的蓝天。包纳了无限的景象!");
l.State= new JuvenileState();
}
}
//少年阶段-JuvenileState
class JuvenileState :LifeState
{
public override void ChangeLife(Life l)
{
Console .WriteLine("少年要用笑脸去追寻梦想,面对梦想,迎接梦想!");
l.State= new YouthState();
}
}
//青年阶段- YouthState
class YouthState :LifeState
{
public override void ChangeLife(Life l)
{
Console.WriteLine("漂亮的豆蔻年华。从青涩走向成熟!");
l.State = new MidlifeState ();
}
}
//中年阶段-MidlifeState
class MidlifeState :LifeState
{
public override void ChangeLife(Life l)
{
Console.WriteLine("中年的你,是否实现自己的愿望。惬意的工作。幸福的家庭!");
l.State= new ElderyState();
}
}
//老年阶段-ElderyState
class ElderyState:LifeState
{
public override void ChangeLife(Life l)
{
Console .WriteLine ("最美只是夕阳红!");
}
}
人生类-----Life
//定义一个人生类-Life
public class Life
{
//初始化当前人生
private LifeState state;
public Life(LifeState state)
{
this.state = state;
}
public LifeState State
{
get { return state; }
set { state = value; }
}
public void ChangeLife() //方法名能够改变
{
state.ChangeLife(this);
}
}
client代码:
static void Main(string[] args)
{
Life life = new Life( new ChildhoodState());
life.ChangeLife();
life.ChangeLife();
life.ChangeLife();
life.ChangeLife();
life.ChangeLife();
Console.Read();
}
执行结果例如以下:
状态模式主要解决的是当控制一个对象状态转化的条件表达式过于复杂时的情况,把状态的推断逻辑转移到表示不同状态的一系列类其中,能够把复杂的推断逻辑简化,总的来说就是当一个对象的内在状态改变时同意改变其行为。这个对象看起来是改变了其类。
在面向对象软件设计时,经常碰到某一个对象因为状态的不同而有不同的行为。假设用if else或是switch case等方法处理,对象操作及对象的状态就耦合在一起,碰到复杂的情况就会造成代码结构的混乱。在这样的情况下,就能够使用状态模式来解决这个问题。