设计模式系列之--状态模式

状态模式

这种类型的设计模式属于行为型模式,它他解决了方法的合理调用
状态模式用于一个事件或对象有很多状态,状态之间会互相转换,对不同状态有不同的行为的情况
状态模式将不同的情况封装为一个类 这样避免了if/else的多次调用 而且增加新的情况不改变原有代码
这样可以通过只一次判断状态就可以完成相应方法的调用

需要的成员 :
状态类 : 写一个状态类的接口提供基本标准 让不同状态类实现接口 产生不同的状态
活动类 : 写一个活动类组合接口来通过判断状态调用不同行为

以抽奖为例

//状态抽象类 (接口也行)
public abstract class State {

    //减少积分
    public abstract void deductMoney();

    //是否中奖
    public abstract boolean raffle();

    //发放奖品
    public abstract void dispensePrize();
}
//表示可以抽奖的状态
public class CanRaffleState extends State {

    RaffleActivity activity = null;

    public CanRaffleState(RaffleActivity activity) {
        this.activity = activity;
    }

    @Override
    public void deductMoney() {
        System.out.println("已经扣除过积分了");
    }

    @Override
    public boolean raffle() {
        System.out.println("正在抽奖 请稍等");
        Random random = new Random();
        int i = random.nextInt(10);
        if(i == 0){
            activity.setState(activity.getDispenseState());
            return true;
        } else {
            System.out.println("很遗憾没有中奖");
            activity.setState(activity.getNoRaffleState());
            return false;
        }
    }

    @Override
    public void dispensePrize() {
        System.out.println("没有抽奖不能中奖");
    }
}

///不能抽奖的状态
public class NoRaffleState extends State {

    RaffleActivity activity;

    public NoRaffleState(RaffleActivity activity){
        this.activity = activity;
    }

    @Override
    public void deductMoney() {
        System.out.println("扣除50积分成功,你可以抽奖了");
        activity.setState(activity.getCanRaffleState());
    }

    @Override
    public boolean raffle() {
        System.out.println("扣了积分才可以抽奖");
        return false;
    }

    @Override
    public void dispensePrize() {
        System.out.println("没有抽奖不能发奖品");
    }
}

//发奖的状态
public class DispenseState extends State {

    RaffleActivity activity = null;

    public DispenseState(RaffleActivity activity) {
        this.activity = activity;
    }

    @Override
    public void deductMoney() {
        System.out.println("已经扣过积分了");
    }

    @Override
    public boolean raffle() {
        System.out.println("已经抽过奖了");
        return false;
    }

    @Override
    public void dispensePrize() {
        if(activity.count > 0){
            System.out.println("恭喜中奖");
            activity.getCount();
            activity.setState(activity.getNoRaffleState());
        } else {
            System.out.println("奖品发完了");
            activity.setState(activity.getDispensOutState());
        }
    }
}

//奖品发完的状态
public class DispenseOutState extends State {

    RaffleActivity activity = null;

    public DispenseOutState(RaffleActivity activity) {
        this.activity = activity;
    }

    @Override
    public void deductMoney() {
        System.out.println("奖品发完了");
    }

    @Override
    public boolean raffle() {
        System.out.println("奖品发完了");
        return false;
    }

    @Override
    public void dispensePrize() {
        System.out.println("奖品发完了");
    }
}


//活动类
public class RaffleActivity{

    State state = null;
    int count = 0;
    State noRaffleState = new NoRaffleState(this);
    State canRaffleState = new CanRaffleState(this);

    State dispenseState = new DispenseState(this);
    State dispensOutState = new DispenseOutState(this);

    public RaffleActivity(int count){
        this.state = noRaffleState;
        this.count = count;
    }

    public void debuctMoney(){
        state.deductMoney();
    }

    public void raffle(){
        if(state.raffle()){
            state.dispensePrize();
        }
    }

    public int getCount(){
        int curCount = count;
        count--;
        return curCount;
    }
/***************下面getter/setter 不重要**********************************/

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public State getNoRaffleState() {
        return noRaffleState;
    }

    public void setNoRaffleState(State noRaffleState) {
        this.noRaffleState = noRaffleState;
    }

    public State getCanRaffleState() {
        return canRaffleState;
    }

    public void setCanRaffleState(State canRaffleState) {
        this.canRaffleState = canRaffleState;
    }

    public State getDispenseState() {
        return dispenseState;
    }

    public void setDispenseState(State dispenseState) {
        this.dispenseState = dispenseState;
    }

    public State getDispensOutState() {
        return dispensOutState;
    }

    public void setDispensOutState(State dispensOutState) {
        this.dispensOutState = dispensOutState;
    }
}

//用户
public class User {
    public static void main(String[] args) {
        RaffleActivity activity = new RaffleActivity(1);

        for(int i = 0 ;i<30;i++){
            System.out.println("----第" + (i+1) + "次抽奖----");

            activity.debuctMoney();
            activity.raffle();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值