zoukankan      html  css  js  c++  java
  • 设计模式(六):状态模式

    一、定义

    允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

    我们的程序中很多情况下是判断一个参数的值,进行一些其他操作。这些情况必须依次过滤直到符合条件的时候,执行具体逻辑。

    二、实例

    我们原来的逻辑:

                PriceFlag pf = PriceFlag.AppPrice;
    
                if (pf == State.PriceFlag.DefaultPrice)
                {
                }
                else if (pf == State.PriceFlag.AppPrice)
                {
                }
                else if (pf == State.PriceFlag.PresellPrice)
                {
                }
                else if (pf == State.PriceFlag.PromotionPrice)
                {
                }
                else
                {
                }
    View Code

    现在我们来创建状态模式:

    2.1  State以及子类

    抽象逻辑单元:我们看到原来的if逻辑通过外界传入的状态参数,根据状态参数进行判断,所以我们需要外界上下文;          

           还有一点,原来的 if 逻辑 在没有符合条件的情况下,自动进入下一个判断逻辑单元。重点已标红.

        public abstract  class PriceProvider
        {             
           public abstract void GetPrice(Context context);        
        }
    
        public class DefaultPrice : PriceProvider
        {
            public override void GetPrice(Context context)
            {
                if (context.flag == PriceFlag.DefaultPrice)
                {
                    Console.WriteLine("获取:默认价格.");
                }
                else
                {
                    context.SetState(new AppPrice());
                    context.Handle();
                }
            }
        }
        public class AppPrice : PriceProvider
        {
            public override void GetPrice(Context context)
            {
                if (context.flag == PriceFlag.AppPrice)
                {
                    Console.WriteLine("获取:APP价格.");
                }
                else
                {
                    context.SetState(new PresellPrice());
                    context.Handle();
                }
            }
        }
        public class PresellPrice : PriceProvider
        {
            public override void GetPrice(Context context)
            {
                if (context.flag == PriceFlag.PresellPrice)
                {
                    Console.WriteLine("获取:预售价格.");
                }
                else
                {
                    context.SetState(new PromotionPrice());
                    context.Handle();
                }
            }
        }
        public class PromotionPrice : PriceProvider
        {       
            public override void GetPrice(Context context)
            {
                if (context.flag == PriceFlag.PromotionPrice)
                {
                    Console.WriteLine("获取:活动价格.");
                }
                else
                {
                    Console.WriteLine("逻辑结束");
                }            
            }       
        }

     2.2 Context 上下文环境,这里有几个重要的功能:设置状态、获取状态、执行逻辑

             还有一点是,维护一个状态类。

     public class Context
        {
            private PriceProvider pp { get; set; } 
            public PriceFlag flag { get; set; }       
            public Context()
            {
                //初始状态:默认价格
                pp = new DefaultPrice();  
            }     
            public void SetState(PriceProvider _pp)
            {
                //设置状态
                pp = _pp;
            }
            public void Handle()
            {
                //执行逻辑
                pp.GetPrice(this);
            }
            public void GetState()
            {
                //获取状态
                Console.WriteLine("当前状态:{0}", flag);
            }
        }
    
        public enum PriceFlag
        {
            DefaultPrice = 0,
            AppPrice = 1,
            PresellPrice = 2,
            PromotionPrice = 3,
            Other = 4
        }
    View Code

     2.3 客户端

                //状态模式
                State.Context context = new Context();
                //变量
                context.flag = State.PriceFlag.PresellPrice;
                context.Handle();
                context.GetState();
                context.flag = State.PriceFlag.PromotionPrice;
                context.Handle();
                context.GetState();

  • 相关阅读:
    枚举、函数关于oracle函数listagg的使用说明by小雨
    执行、Mongodb MapReduce示例1个by小雨
    事务、异常TSQL 编码时应该注意的10个问题by小雨
    源、执行GoldenGate 单向DDL同步by小雨
    Oracle中的所有权限by小雨
    数据库、版本数据库学习从此开始by小雨
    统计、案例深入理解Oracle索引(10):索引列字符类型统计信息的32位限制by小雨
    字段、数据库表三大范式及存储方式by小雨
    数据库、用户第二章Getting Start with the Oracle Server(oracle入门)by小雨
    搜索、关键字截图留念,“万能数据库查询分析器”作为关键字在百度和谷歌上的海量搜索结果by小雨
  • 原文地址:https://www.cnblogs.com/sunchong/p/5111870.html
Copyright © 2011-2022 走看看