状态模式--随遇而安(行为模式08)

来源:互联网 发布:photoshop软件功能 编辑:程序博客网 时间:2024/05/22 22:51

什么是状态模式
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了他的类。
状态模式中的行为是由状态来决定的,不同状态下有不同的行为,状态模式和策略模式的结构几乎完全一样,但他们的目的、本质却完全不同。状态模式的行为是平行不可替换的,策略模式的行为是相互独立可以替换的。

状态模式的适用场景
对象的行为取决于他的状态并随之改变行为。

状态模式用例
电视机和遥控器的关系,开机状态下我们可以切换频道,调节音量等操作,在开机状态下开机无效,关机状态下我们操作音量频道也是无效的。

UML类图
这里写图片描述

接口TVState:

public interface TVState {    public void nextChannel();    public void preChannel();    public void turnUp();    public void turnDown();}

实现类PowerOnState:

public class PowerOnState implements TVState {    @Override    public void nextChannel() {        System.out.println("切换到下一频道");    }    @Override    public void preChannel() {        System.out.println("切换到上一频道");    }    @Override    public void turnUp() {        System.out.println("调大音量");    }    @Override    public void turnDown() {        System.out.println("调小音量");    }}

实现类PowerOffState:

public class PowerOffState implements TVState {    @Override    public void nextChannel() {        // TODO Auto-generated method stub    }    @Override    public void preChannel() {        // TODO Auto-generated method stub    }    @Override    public void turnUp() {        // TODO Auto-generated method stub    }    @Override    public void turnDown() {        // TODO Auto-generated method stub    }}

接口PowerControllor:

public interface PowerControllor {    public void powerOn();    public void powerOff();}

实现类TVControllor:

public class TVControllor implements PowerControllor,TVState {    TVState mState;    public void setTVState(TVState mTVState){        this.mState = mTVState;    }    @Override    public void powerOn() {        setTVState(new PowerOnState());        System.out.println("开机了");    }    @Override    public void powerOff() {        setTVState(new PowerOffState());        System.out.println("关机了");    }    @Override    public void nextChannel() {        mState.nextChannel();    }    @Override    public void preChannel() {        mState.preChannel();    }    @Override    public void turnUp() {        mState.turnUp();    }    @Override    public void turnDown() {        mState.turnDown();    }}

测试类:

public class Test {    public static void main(String[] args) {        TVControllor tvControllor = new TVControllor();        //开机        tvControllor.powerOn();        //切换频道        tvControllor.nextChannel();        //调高音量        tvControllor.turnUp();        //关机        tvControllor.powerOff();        //调高音量,因为是关机状态,此时不再生效        tvControllor.turnUp();    }}

运行结果:

开机了切换到下一频道调大音量关机了

状态模式总结
状态模式的关键在于对于不同的状态下对同一行为有不同的响应。
状态模式的优点:避免代码膨胀同时也保证了可扩展性。
状态模式的缺点:会增加系统类和对象数量

原创粉丝点击