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();

  • 相关阅读:
    python接口自动化之发送post(四)
    python接口自动化之发送get(三)
    python接口自动化之fiddler使用(二)
    python读取yaml配置文件
    python接口自动化测试之http协议(一)
    python接口自动化测试之根据excel中的期望结果是否存在于请求返回的响应值中来判断用例是否执行成功
    python3读取、写入、追加写入excel文件
    python UI自动化之处理多窗口
    python UI自动化之js操作
    python UI自动化之切换iframe
  • 原文地址:https://www.cnblogs.com/sunchong/p/5111870.html
Copyright © 2011-2022 走看看