设计模式笔记22——状态模式(state)

APP抽奖活动问题

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

1) 假如每参加一次这个活动要扣除用户50积分,中奖概率是10%

2) 奖品数量固定,抽完就不能抽奖

3) 活动有四个状态: 可以抽奖、不能抽奖、发放奖品和奖品领完

4) 活动的四个状态转换关系图

基本介绍

1) 状态模式(State Pattern):它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换

2) 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类

状态模式原理类图

对原理类图的说明-即(状态模式的角色及职责)

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

2) State 是抽象状态角色,定义一个接口封装与Context 的一个特点接口相关行为

3) ConcreteState 具体的状态角色,每个子类实现一个与Context 的一个状态相关行为

核心代码:

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 创建活动对象,奖品有1个奖品
        RaffleActivity activity = new RaffleActivity(1);

        // 我们连续抽300次奖
        for (int i = 0; i < 30; i++) {
            System.out.println("--------第" + (i + 1) + "次抽奖----------");
            // 参加抽奖,第一步点击扣除积分
            activity.debuctMoney();

            // 第二步抽奖
            activity.raffle();
        }
    }

而每次调用activity.debuctMoney()方法时,实际调用了state的方法
    //扣分, 调用当前状态的 deductMoney
    public void debuctMoney(){
        state.deductMoney();
    }

state.deductMoney()会根据state对象给出不通的实现方法:
    //已经扣除了积分,不能再扣
    @Override
    public void deductMoney() {
        System.out.println("已经扣取过了积分");
    }

这样就实现了改变状态时,行为也改变了。

public static void main(String[] args) {

// TODO Auto-generated method stub

// 创建活动对象,奖品有1个奖品

RaffleActivity activity = new RaffleActivity(1);

// 我们连续抽300次奖

for (int i = 0; i < 30; i++) {

System.out.println("--------第" + (i + 1) + "次抽奖----------");

// 参加抽奖,第一步点击扣除积分

activity.debuctMoney();

// 第二步抽奖

activity.raffle();

}

}

而每次调用activity.debuctMoney()方法时,实际调用了state的方法

//扣分, 调用当前状态的 deductMoney

public void debuctMoney(){

state.deductMoney();

}

state.deductMoney()会根据state对象给出不通的实现方法:

//已经扣除了积分,不能再扣

@Override

public void deductMoney() {

System.out.println("已经扣取过了积分");

}

这样就实现了改变状态时,行为也改变了。

猜你喜欢

转载自blog.csdn.net/qq_22059611/article/details/103306293