博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式(六):状态模式
阅读量:4598 次
发布时间:2019-06-09

本文共 3426 字,大约阅读时间需要 11 分钟。

一、定义

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

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

二、实例

我们原来的逻辑:

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

 

转载于:https://www.cnblogs.com/sunchong/p/5111870.html

你可能感兴趣的文章
[android]深入理解findViewById原理
查看>>
实验四
查看>>
easypoi 一行代码搞定excel导入导出
查看>>
JumpServer安装与使用
查看>>
前端构建工具gulp
查看>>
ref:CodeIgniter框架内核设计缺陷可能导致任意代码执行
查看>>
1475.ip数据包解析
查看>>
JAVA 笔记(一)
查看>>
jdk+Tomcat部署安装
查看>>
js 循环读取 json的值
查看>>
c# 范型Dictionary实用例子
查看>>
SPOJ FIBPOL - Fibonacci Polynomial
查看>>
C#实现动态页面静态化
查看>>
windows下python一些库编译问题
查看>>
centos 7设置limit,不生效问题
查看>>
外部引用CSS中 link与@import的区别
查看>>
各种语言学习
查看>>
将博客搬至CSDN
查看>>
计算机硬盘大小转换(B,KB,MB,GB,TB,PB之间的大小转换)
查看>>
10.2计数与概率基础
查看>>