设计模式_12:状态模式

来源:互联网 发布:java给qq邮箱发邮件 编辑:程序博客网 时间:2024/06/05 19:40

创建一个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 太累,不干了




原创粉丝点击