设计模式之状态模式练习

题目:

某纸牌游戏软件中,人物角色具有人门级(Primary)、熟练级(Secondary),高手绍(Professional)和骨灰级(Final)四种等级,角色的等级与其积分相对应,游戏胜利将增加和分,失败则扣除积分。人门级具有最基本的游戏功能 play(),熟练级增加丁游戏胜利积分加倍功能doubleScore),高手级在熟练级基础上再增加换牌功能 changeCards(),骨灰级在高手级基础上再增加偷看他人的牌功能 peekCards()。现使用状态模式来设计该系统,绘制类图并编程实现。

规则
新手Primary: point < 30, 熟练Secondary : 30=< point < 50, 高手professionary: 50=< point < 60, 骨灰final: point > =60
其中积分翻倍这里也是使用的积分加20而已,换牌、看牌就只输出提示信息。
本文参考 设计模式-状态模式练习_优雅的发际线的博客-CSDN博客,有兴趣的小伙伴可以前往查看。

类图这边就不画了,作者很懒,我就直接上代码吧。

代码

public class Main {
    public static void main(String[] args) {
        Context context = new Context();
        context.play(false);
        context.play(true);
        context.play(true);
        context.play(false);
        context.doubleScore();
        context.play(true);
        context.play(true);
        context.doubleScore();
        context.peekCards();
        context.play(false);
    }
}
public class Context {
    public State state;
    public String name;

    public State getState() {
        return state;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Context(){
        this.state = new PrimaryState(0, this);
    }
    public void play(Boolean isWin){
        state.play(isWin);
    }

    public void doubleScore(){
        state.doubleScore();
    }

    public void peekCards(){
        state.peekCards();
    }
}
public interface State {
    void play(Boolean isWin);
    void checkState();
    void doubleScore();
    void peekCards();
}
public class PrimaryState implements State{

    public int score;
    public Context context;

    public PrimaryState(int score, Context context){
        this.score = score;
        this.context = context;
    }

    @Override
    public void play(Boolean isWin) {
        if (isWin){
            score += 10;
        }else {
            score -= 10;
            if (score < 0){
                score = 0;
            }
        }
        System.out.println("当前状态是primary, 积分为 : " + score);
        checkState();
    }

    @Override
    public void checkState() {
        if (score > 20){
            System.out.println("升级成为Secondary状态啦");
            context.setState(new SecondaryState(score, context));
        }
    }

    @Override
    public void doubleScore() {
        System.out.println("primary阶段没有这个功能");
    }

    @Override
    public void peekCards() {
        System.out.println("primary阶段没有这个功能");
    }
}
public class SecondaryState implements State{

    public int score;
    public Context context;

    public SecondaryState(int score, Context context){
        this.score = score;
        this.context = context;
    }

    @Override
    public void play(Boolean isWin) {
        if (isWin){
            score += 10;
        }else {
            score -= 10;
        }
        System.out.println("当前状态是Secondary, 积分为 : " + score);
        checkState();
    }

    @Override
    public void checkState() {
        if (score < 30){
            System.out.println("抱歉要降成Primary状态~");
            context.setState(new PrimaryState(score, context));
        }
        if (score > 40){
            System.out.println("升级成为Professional状态啦");
            context.setState(new ProfessionalState(score, context));
        }
    }

    @Override
    public void doubleScore() {
        score += 20;
        System.out.println("使用doubleScore功能,积分增加20");
        System.out.println("积分变为 : " + score);
        checkState();
    }

    @Override
    public void peekCards() {
        System.out.println("抱歉");
    }
}
import javax.naming.ldap.Control;

public class ProfessionalState implements State{

    public int score;
    public Context context;

    public ProfessionalState(int score, Context context) {
        this.score = score;
        this.context = context;
    }

    @Override
    public void play(Boolean isWin) {
        if (isWin){
            score += 10;
        }else {
            score -= 10;
        }
        System.out.println("当前状态是Secondary, 积分为 : " + score);
        checkState();
    }

    @Override
    public void checkState() {
        if (score < 60){
            System.out.println("抱歉要降成Secondary状态~");
            context.setState(new SecondaryState(score, context));
        }
    }

    @Override
    public void doubleScore() {
        score += 20;
        System.out.println("使用doubleScore功能,积分增加20");
        System.out.println("积分变为 : " + score);
        checkState();
    }

    @Override
    public void peekCards() {
        System.out.println("偷看了别人的牌,这功能真不要脸");
    }
}

结果

当前状态是primary, 积分为 : 0
当前状态是primary, 积分为 : 10
当前状态是primary, 积分为 : 20
当前状态是primary, 积分为 : 10
primary阶段没有这个功能
当前状态是primary, 积分为 : 20
当前状态是primary, 积分为 : 30
升级成为Secondary状态啦
使用doubleScore功能,积分增加20
积分变为 : 50
升级成为Professional状态啦
偷看了别人的牌,这功能真不要脸
当前状态是Secondary, 积分为 : 40
抱歉要降成Secondary状态~

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值