有人说“人的起点起初都是一样的,在后来的加加减减中,慢慢出现了差距……”人生是什么?人生如你脚下的路,如但丁在《神曲》里的一句话“在人生旅程的中途……”不论曾经做对了什么,做错了什么,用一颗心、一生情去坚定走你没走完的路。人生是什么?是一幅优美的画卷,是一段离奇的爱情故事,还是一曲悠悠的伤感乐曲……我无法形容人生是什么,为什么会有各式各样的人生经历,有人哭有人笑,有人淡然,有人超然,细看人间故事,品酸甜苦辣。
每个人的人生犹如一个个小小的圆圈,随着时间的推移,这个圆慢慢的慢慢的长大,圆里面是一个过程,纷繁复杂着那一段一段的经历。从童年开始,一直到老年落幕,我们都一直在人生的舞台上尽情演绎自己的故事。今天我们的设计模式就从人生开始说起,人生有着五个明确的阶段,从童年,少年,青年,中年,一直到老年落幕,也可以这么说,人的一生分为五个状态,宛如我们设计模式中的状态模式,首先我们来看一下状态模式的结构图:
![](https://box.kancloud.cn/2015-12-30_5683743be27b9.jpg)
以我们的人生为例,看看状态模式是如何活跃着我们人生的舞台:
首先抽象状态类-----抽象类 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);
}
}
~~~
客户端代码:
~~~
static void Main(string[] args)
{
Life life = new Life( new ChildhoodState());
life.ChangeLife();
life.ChangeLife();
life.ChangeLife();
life.ChangeLife();
life.ChangeLife();
Console.Read();
}
~~~
运行结果如下:
![](https://box.kancloud.cn/2015-12-30_5683743c026da.jpg)
状态模式主要解决的是当控制一个对象状态转化的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化,总的来说就是当一个对象的内在状态改变时允许改变其行为,这个对象看起来是改变了其类。
在面向对象软件设计时,常常碰到某一个对象由于状态的不同而有不同的行为。如果用if else或是switch case等方法处理,对象操作及对象的状态就耦合在一起,碰到复杂的情况就会造成代码结构的混乱。在这种情况下,就可以使用状态模式来解决问题。