一、概念
①、什么是状态者模式?
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
②、主要解决什么问题?
对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。
③、如何解决?
将各种具体的类抽象出来。
④、应用实例?
打篮球的时候运行员可以有正常状态、不正常状态和超长状态。
⑤、使用场景?
1、行为随状态改变而改变的场景。
2、条件、分支语句的代替者。
⑥、优缺点?
优点: 1、封装了转换规则。 2、枚举可能的状态,在枚举状态之前需要确定状态种类。 3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。 5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。
缺点: 1、状态模式的使用必然会增加系统类和对象的个数。 2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。 3、状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。
二、图
①、结构图
②、拓展图
三、代码
①、类图
②、代码
客户端
class Program
{
static void Main(string[] args)
{
Work work = new Work(); //用工作类实例化一个工作对象work,初始状态为上午状态
work.Hour = 9; //给work对象的Hour属性进行赋值
work.WriteProgram(); //调取work对象写程序方法
work.Hour = 12;
work.WriteProgram();
work.Hour = 14;
work.WriteProgram();
work.Hour = 17;
work.TaskFinished = false; //工作未完成
work.WriteProgram();
work.Hour = 19;
work.WriteProgram();
work.Hour = 22;
work.WriteProgram();
Console.Read();
}
}
抽象状态类
public abstract class State
{
public abstract void WriteProgram(Work w); //创建抽象写程序方法,参数为工作类的具体对象
}
具体工作状态类(以上午工作状态为例)
public class ForenoonState:State
{
public override void WriteProgram(Work w)
{
if(w.Hour<12) //如果工作时间小于12个小时
{
Console.WriteLine("当前时间:{0}点 上午工作,精神百倍", w.Hour); //在控制台内写入内容
}
else //否则
{
w.SetState(new NoonState()); //设置工作状态为下一个状态
w.WriteProgram();
}
}
}
工作类
public class Work
{
private State current;
public Work()
{
current = new ForenoonState();
}
private double hour;
public double Hour
{
get { return hour; }
set { hour = value; }
}
private bool finish = false; //这个类中第一个被读取:声明赋值
public bool TaskFinished
{
get { return finish; }
set { finish = value; }
}
public void SetState(State s)
{
current = s;
}
public void WriteProgram() //Work类的写程序方法
{
current.WriteProgram(this); //方法调取方法,此处为调取当前状态的写程序方法:this代表的是当下这个工作类,含依附于的所有属性内容
}
}
四、拓展
https://www.cnblogs.com/guyun/p/6197956.html