状态模式引导篇及原理

  • 作者: 凯哥Java
  • 设计模式
  • 时间:2019-09-16 09:35
  • 558人已阅读
简介 状态模式引导篇及原理讲解状态模式原理之前,我们先来模拟一个项目,然后对项目进行需求升级,发现之前设计不符合新需求了,从而来引导出状态模式原理。模拟项目:一个糖果机(或者售票机)。智能糖果机,使用Java软件来控制糖果机.本文出处凯哥Java(kaigejava)讲《23种设计模》系列教程种的《状态模式引导篇及原理》需求分析:我们来简化糖果机出糖果的过程:开机-->待机状态-->投入硬币

状态模式引导篇及原理

讲解状态模式原理之前,我们先来模拟一个项目,然后对项目进行需求升级,发现之前设计不符合新需求了,从而来引导出状态模式原理。

模拟项目:一个糖果机(或者售票机)。智能糖果机,使用Java软件来控制糖果机.

本文出处凯哥Java(kaigejava)讲《23种设计模》系列教程种的《状态模式引导篇及原理》

需求分析:

我们来简化糖果机出糖果的过程:

开机-->待机状态-->投入硬币-->转动把手-->滑落一颗糖果-->待机(根据集群内糖果库存情况,是否提示售完)。

我们可以发现,出糖果的过程,就是机器的几个不同状态的。

状态模式引导篇及原理


说明:0初始化待机状态,1是投币 2是摇动手柄3是掉糖果。

我们先来看看传统是怎么实现的。

先给出(枚举或者列出)几个表示不同状态的code.

状态模式引导篇及原理


根据不同的code(状态),输出对应的消息:

状态模式引导篇及原理


上面代码,就能满足需求了。是不是很简单?但是,又有了新需求,加入游戏元素:中秋国庆双节,有10%的概率可以拿到2颗糖果!

思考怎么实现。

方案一:添加一个4的状态,用来标识10%的。就如下图了:

状态模式引导篇及原理


那再来个20%、45%怎么办?是不是还需要添加状态5、6?然后代码再一通的修改?这样是不是就违背了我们开闭原则?

我们需要思考的是:无论是原有的0-3还是新增加的4、5、6。这些都是状态的变化。

其中变化与不变的是什么?我们可以使用面向接口的思路来开发。

我们先列出表格,糖果机项目,状态和动作的关系如下表格:

状态模式引导篇及原理


我们结果分析,可以将状态抽取成一个接口。具体类图如下:

状态模式引导篇及原理


上图其实就是状态模式的类图。

什么是状态模式?

一句话概括:能根据内部状态的变化,来改变对象的行为,看起来好像是修改了类。属于行为类的模式。


Top Top