zoukankan      html  css  js  c++  java
  • 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模式了.

  • 相关阅读:
    从零开始学android开发-四大组件之一 Activity
    从零开始学android开发-详细谈谈intent的startActivityForResult()方法
    从零开始学android-一行两个按钮居中 布局
    nginx上用fastcgi配置python环境
    服务器程序源代码分析之三:gunicorn
    全面解读python web 程序的9种部署方式
    python检测文件是否更新
    nginx安装
    solr教程,值得刚接触搜索开发人员一看
    Shell标准输出、标准错误 >/dev/null 2>&1
  • 原文地址:https://www.cnblogs.com/May-day/p/6702543.html
Copyright © 2011-2022 走看看