一,什么是状态设计模式?
1,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
2,当一个对象的内部状态改变时允许改变其行为,这个对象看起来像是改变了其类
二,如下代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _18.状态者模式 { /// <summary> /// 每个对象都有其对应的状态,而每个状态又对应一些相应的行为,如果某个对象有多个状态时,那么就会对应很多的行为。 /// 那么对这些状态的判断和根据状态完成的行为,就会导致多重条件语句,并且如果添加一种新的状态时,需要更改之前现有的代码。 /// 这样的设计显然违背了开闭原则。状态模式正是用来解决这样的问题的。 /// 状态模式将每种状态对应的行为抽象出来成为单独新的对象,这样状态的变化不再依赖于对象内部的行为。 /// </summary> class Program { static void Main(string[] args) { People ch = new Chinese(); Context context = new Context() { people = ch }; ch.Say(); context.Show(); context.Turn(); context.Show(); context.Turn(); context.Show(); } } /// <summary> /// 抽象人 /// </summary> public abstract class People { public PeopleEnum peopleEnum; public void Say() { Console.WriteLine("我们是人!!!"); } /// <summary> /// 展示自定义逻辑 /// </summary> public abstract void Show(); /// <summary> /// 切换状态枚举 /// </summary> public abstract void Turn(); /// <summary> /// 切换状态实例 /// </summary> /// <param name="context"></param> public abstract void TurnContext(Context context); } public class Context { public People people { get; set; } public void Show() { this.people.Show(); } public void Turn() { this.people.TurnContext(this); } } /// <summary> /// 具体实现 /// </summary> public class Chinese : People { public override void Show() { Console.WriteLine("中国人说中文"); } public override void Turn() { this.peopleEnum = PeopleEnum.英国人; } public override void TurnContext(Context context) { context.people = new English(); } } /// <summary> /// 具体实现 /// </summary> public class English : People { public override void Show() { Console.WriteLine("英国人说英文"); } public override void Turn() { this.peopleEnum = PeopleEnum.中国人; } public override void TurnContext(Context context) { context.people = new Chinese(); } } /// <summary> /// 状态枚举 /// </summary> public enum PeopleEnum { 中国人 = 0, 英国人 = 1, } }
使用场景: State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了.