感慨:
有时候生活中总会遇到这样的尴尬状况:话说着说着,突然就不理人了!感同身受一下,遇到这样的情况真的是心里很不好受啊!尽管他是无意的,可是结果已经成这样的,到最后肯定是矛盾一场啊!不过天最终还是会晴的,不就之后就会发现刚才吵架的两个人又有说有笑了!总结一句话:人呐!真是善变的动物!
人的生活不就是四种表情状态吗?喜怒哀乐!阴晴不定!用个图来形容一下:
结构图:
实现的相关代码:
客户端:
- <span style="font-size: 24px;"><strong>static void Main(string[] args)
- {
- Person person = new Person(new JoyfulState());
- person.ChangeState(); //四种心情循环一下
- person.ChangeState();
- person.ChangeState();
- person.ChangeState();
- }</strong></span>
<span style="font-size:24px;"><strong>static void Main(string[] args)
{
Person person = new Person(new JoyfulState());
person.ChangeState(); //四种心情循环一下
person.ChangeState();
person.ChangeState();
person.ChangeState();
}</strong></span>
抽象状态类:
- <span style="font-size: 24px;"><strong>//ExpressionState抽象状态类 ,定义一个接口以封装与Person的一个特定状态相关的行为。
- abstract class ExpressionState
- {
- public abstract void Feel(Person p);
- }
- //具体表情类
- class JoyfulState:ExpressionState
- {
- public override void Feel(Person p)
- {
- p.espressionstate = new AngryState();
- Console.WriteLine("此刻心情很愉快!");
- }
- }</strong></span>
<span style="font-size:24px;"><strong>//ExpressionState抽象状态类 ,定义一个接口以封装与Person的一个特定状态相关的行为。
abstract class ExpressionState
{
public abstract void Feel(Person p);
}
//具体表情类
class JoyfulState:ExpressionState
{
public override void Feel(Person p)
{
p.espressionstate = new AngryState();
Console.WriteLine("此刻心情很愉快!");
}
}</strong></span>
具体状态1
- <span style="font-size: 24px;"><strong> class AngryState:ExpressionState
- {
- public override void Feel(Person p)
- {
- p.espressionstate = new SorrowState(); //心情生气之后,转入悲哀状态
- Console.WriteLine("此刻心情很生气!");
- }
- }</strong></span>
<span style="font-size:24px;"><strong> class AngryState:ExpressionState
{
public override void Feel(Person p)
{
p.espressionstate = new SorrowState(); //心情生气之后,转入悲哀状态
Console.WriteLine("此刻心情很生气!");
}
}</strong></span>
具体的Person实例类
- <span style="font-size: 24px;"><strong> public ExpressionState espressionstate
- {
- get { return expressionstate ; }
- set { expressionstate = value; }
- }
- public Person (ExpressionState expressionstate) //定义Person的初始状态
- {
- this.expressionstate = expressionstate ;
- }
- public void ChangeState() //心情转换
- {
- expressionstate.Feel(this);
- }</strong></span>
<span style="font-size:24px;"><strong> public ExpressionState espressionstate
{
get { return expressionstate ; }
set { expressionstate = value; }
}
public Person (ExpressionState expressionstate) //定义Person的初始状态
{
this.expressionstate = expressionstate ;
}
public void ChangeState() //心情转换
{
expressionstate.Feel(this);
}</strong></span>
实现状态:
其实心情真的是受各种因素影响的,如天气,今天的环境氛围等等!自己就很不喜欢阴天,那样心情也会随着其变换而变换……
还是尽量保持愉快的心情吧!在自己 不同的心情下做同一件事情,猜测一下,会产生怎样不同的结果呢?
与孪生兄弟“策略模式”的比较:
状态模式属于行为型模式。其定义是当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
之所以与策略模式自称孪生兄弟,是因为两者的结构图一样,实则各有各的想法,各有各的意愿。
在建模的过程中,策略模式是让用户指定更换的算法,而状态模式是状态在满足一定的状态下的自动更换,用户无法指定状态,最多只能设置初始状态;我们在编写代码的时候,遇到一系列的条件判断的时候,可能会采用策略模式来优化结构,因为这时候涉及到策略的选择,但有时候仔细就会发现,这些所谓的策略其实是对象的不同状态更加明显的是,对象的某种状态也成为判断的条件;在状态模式中,状态的变迁是由对象的内部条件决定,外界只需关心其接口,不必关心其状态对象的创建和转化,而策略模式里,采用何种模式由外部条件决定。
总结与分析:
好处:
将与特定状态相关的行为局部化,并且将不同状态的行为分割开来,说白了,就是为了消除庞大的条件分支语句,状态模式是将各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。
使用情况:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用此模式了!