设计模式_12:状态模式

本文通过对比原始的if-else条件判断实现与状态模式实现,展示了如何使用状态模式来简化和优化Hero类的工作方法,使其更符合软件设计原则。

创建一个Hero类,有一个方法work可以根据当前实例的体力(power)和是否过于疲倦(isTired)来做出不同的反应:

public class Main {

    public static void main(String[] args) {

        Hero hero = new Hero(100, false);
        hero.work();
        hero.setPower(75);
        hero.work();
        hero.setPower(50);
        hero.work();
        hero.setPower(25);
        hero.work();
        hero.setPower(0);
        hero.work();
        hero.setTired(true);
        hero.work();

    }
}

class Hero {

    private int power;
    private boolean isTired;

    public Hero(int power, boolean isTired) {
        this.power = power;
        this.isTired = isTired;
    }

    public void work() {
        if (power > 75){
            System.out.println("power:" +power+ " 精力充沛地干活");
        }
        else if (power > 50){
            System.out.println("power:" +power+ " 不慌不忙地干活");
        }
        else if (power > 25){
            System.out.println("power:" +power+ " 疲惫不堪地干活");
        }
        else {
            if (!isTired){
                if (power > 0){
                    System.out.println("power:" +power+ " 极度疲劳地干活");
                }
                else {
                    System.out.println("power:" +power+ " 体力透支,晕倒了");
                }
            }
            else {
                System.out.println("power:" +power+ " 太累,不干了");
            }
        }
    }

    public int getPower() {
        return power;
    }

    public void setPower(int power) {
        this.power = power;
    }

    public boolean isTired() {
        return isTired;
    }

    public void setTired(boolean tired) {
        isTired = tired;
    }
}
运行结果:

power:100 精力充沛地干活
power:75 不慌不忙地干活
power:50 疲惫不堪地干活
power:25 极度疲劳地干活
power:0 体力透支,晕倒了
power:0 太累,不干了

可以看到代码中有较多的if-else判断,意味着这个方法的责任过大,如果改动或添加分支,都需要在这个方法上改,维护出错的风险增大,违背了单一职责原则、开闭原则
我们可以用状态模式来改良这个设计:


public class Main {

    public static void main(String[] args) {

        Hero hero = new Hero(100, false);
        hero.work();
        hero.setPower(75);
        hero.work();
        hero.setPower(50);
        hero.work();
        hero.setPower(25);
        hero.work();
        hero.setPower(0);
        hero.work();
        hero.setTired(true);
        hero.work();

    }
}

//抽象状态接口
interface IState {
    void work(Hero hero);
}

class HappyWork implements IState{

    @Override
    public void work(Hero hero) {
        if (hero.getPower() > 75){
            System.out.println("power:" +hero.getPower()+ " 精力充沛地干活");
        }
        else {
            hero.setCurState(new NormalWork());
            hero.work();
        }
    }
}

class NormalWork implements IState{

    @Override
    public void work(Hero hero) {
        if (hero.getPower() > 50){
            System.out.println("power:" +hero.getPower()+ " 不慌不忙地干活");
        }
        else {
            hero.setCurState(new TiredWork());
            hero.work();
        }
    }
}

class TiredWork implements IState{

    @Override
    public void work(Hero hero) {
        if (hero.getPower() > 25){
            System.out.println("power:" +hero.getPower()+ " 疲惫不堪地干活");
        }
        else {
            hero.setCurState(new VeryTiredWork());
            hero.work();
        }
    }
}

class VeryTiredWork implements IState{

    @Override
    public void work(Hero hero) {

        if (!hero.isTired()){
            if (hero.getPower() > 0){
                System.out.println("power:" +hero.getPower()+ " 极度疲劳地干活");
            }
            else {
                hero.setCurState(new SleepWork());
                hero.work();
            }
        }
        else {
            hero.setCurState(new NoPowerWork());
            hero.work();
        }
    }
}

class SleepWork implements IState{
    @Override
    public void work(Hero hero) {
        if (hero.isTired()) {
            hero.setCurState(new NoPowerWork());
            hero.work();
        }
        else {
            System.out.println("power:" +hero.getPower()+ " 体力透支,晕倒了");
        }
    }
}

class NoPowerWork implements IState{
    @Override
    public void work(Hero hero) {
        System.out.println("power:" +hero.getPower()+ " 太累,不干了");
    }
}



class Hero {

    //这里增加一个当前状态的引用
    private IState curState;
    private int power;
    private boolean isTired;

    public Hero(int power, boolean isTired) {
        this.power = power;
        this.isTired = isTired;
        this.curState = new HappyWork();
    }

    public void work() {
        this.curState.work(this);
    }

    public int getPower() {
        return power;
    }

    public void setPower(int power) {
        this.power = power;
    }

    public boolean isTired() {
        return isTired;
    }

    public void setTired(boolean tired) {
        isTired = tired;
    }

    public IState getCurState() {
        return curState;
    }

    public void setCurState(IState curState) {
        this.curState = curState;
    }
}
运行结果:

power:100 精力充沛地干活
power:75 不慌不忙地干活
power:50 疲惫不堪地干活
power:25 极度疲劳地干活
power:0 体力透支,晕倒了
power:0 太累,不干了




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值