小编复习软考,遇到了很多模式,其中一个很有意思的就是状态模式,下面就有小编来给大家介绍一下。
what
普遍定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来形式改变了其类
自己总结:对象的行为随着状态改变
when
那么何时使用呢?这个根据定义就可知道,当对象的行为根据状态变化,并且在运行时刻根据状态变化,就考略用状态模式.也可以说,当一个对象的转换条件过于复杂的时候,使用这个模式可以使逻辑简化。
why
为什么使用呢?这个其实还是把变化的抽离出来,就是讲不同行为的状态分离出来
思考:
1、this在里面代表什么
2、state是从什么地方引用过来的
3、章台的该bain是hi怎样引起行为的改变的
4、为什么用Context作为State抽象类方法里的参数
demo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 状态模式
{
class Program
{
//当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变其类
static void Main(string[] args)
{
Context C = new Context(new ConcreteStateA());
C.Request();
C.Request();
C.Request();
Console.Read();
}
abstract class State
{
public abstract void Handle(Context context);//为什么? 体现聚合,State调用Context
}
class ConcreteStateA : State
{
public override void Handle(Context context)
{
context.state = new ConcreteStateB();
}
}
class ConcreteStateB : State
{
public override void Handle(Context context)
{
context.state = new ConcreteStateA();
}
}
class Context
{
public State state;//为什么设置私有
public Context(State state)
{
this.state = state;//体现聚合,定义Context初始状态
}
public void Request()
{
state.Handle(this);//为什么参数用this? 对请求做处理,并设置下一状态
}
public State State//可读写的状态属性, 用于读取当前状态和设置新状态 为什么添加这个?
{
get { return state; }
set
{
state = value;
Console.WriteLine("当前状态:" + state.GetType().Name);
}
}
}
}
}