App抽奖活动问题分析

请编写程序完成APP抽奖活动 具体要求如下:

  1. 假如每参加一次这个活动要扣除用户``50积分,中奖概率是``10%
  2. 奖品数量固定,抽完就不能抽奖
  3. 活动有四个状态: 可以抽奖、不能抽奖、发放奖品和奖品领完
  4. 活动的四个状态转换关系图

(下``图``)
image.png

状态模式基本介绍

  1. 状态模式(State pattern):他主要采用解决对象在多种状态转换时,需要对外输出不同的行为问题。状态和行为是一一对应的,状态之间可以相互转换
  2. 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类

    状态模式的原理 类图

    image.png

  3. Context 类为环境角色。用于维护State实例,这个实例定义当前状态。

  4. State 时抽象状态角色。定义一个接口封装与Context 的一个特定接口相关行为。
  5. ConcreteState 具体的状态角色,每个子类实现一个与Context 的一个状态相关行为。

    状态模式解决App抽奖问题

  • 接口(类图)

image.png

  • 抽象类(类图)

image.png

状态模式在实际项目-借贷平台 源码剖析

  • 流程图

image.png

  • 类图

image.png
状态模式在实际项目-借贷平台 源码剖析

  1. 借贷平台的订单,有审核-发布-抢单 等等 步骤,随着操作的不同,会改变订单状态,项目中的这个模块实现就会使用到状态模式
  2. 通常通过 if/else 判断订单的状态,从而实现不同的逻辑,伪代码如下
  1. if(审核){
  2. //审核逻辑
  3. }elseif(发布){
  4. //发布逻辑
  5. }elseif(接单){
  6. //接单逻辑
  7. }else{
  8. }
问题分析 : 这类代码难以应对变化,在添加一种状态时,我们需要手动
添加if/else,在添加一种功能时,要对所有的状态进行判断。
因此代码会变得越来越臃肿,并且一旦没有处理某个状态,
便会发生极其严重的BUG,难以维护
  1. 使用状态模式完成 借贷平台项目的审核模块 [设计+代码]

    状态模式的注意事项和细节

  2. 代码有很强的可读性。

    • 状态模式每个状态的行为封装到对应的一个类中
  3. 方便维护。
    • 将容易产生问题的if-else 语句删除了,如果把每个状态的行为都放到一个类中,每次调用方法时都要判断当前时什么状态,不但会产生出很多if -else 语句,而且容易出错。
  4. 符合开闭原则。
    • 容易增删状态。
  5. 会产生很多类。每个状态都要一个对应的类,当状态过多时会产生很多类,加大维护难度。
  6. 应用场景:当一个事件或者对象有很多种状态,状态之间相互转换,对不同的状态有不同的要求的时候,可以考虑使用状态模式。