C#设计模式:状态者模式(State Pattern)

一,什么是状态设计模式?

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模式了.

原文地址:https://www.cnblogs.com/May-day/p/6702543.html