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