设计模式-10 状态模式

来源:互联网 发布:纳什均衡和福利最优化 编辑:程序博客网 时间:2024/05/21 17:35

状态模式介绍
状态模式就是在不同的状态下的同一种行为会有不同的结果。他和策略模式的类结构几乎一样。但是却和策略模式有着本质的不同。比如以打铁为例:在状态模式下:那么同样是打铁,当铁的温度在1500度和30度。打铁的行为会对铁造成不同的变化。30度打铁,铁肯定不会有变化,但是1500度将会成钢。那么策略模式下:更注重的是打铁的方式,比如同样是1500度,那么手动打铁和用轧钢厂的机械打铁是两种方式。

状态模式的使用场景
1)一个对象的行为取决于它的状态,并且根据根据不同的状态,其会有不同的结果。
2)当一个类中有根据状态有关的条件语句(if-else switch-case)时。

UML类图
这里写图片描述

状态模式下的简单示例

电视机开的时候,可以换台,调声音,关闭电视。当电视关闭的时候只能打开电视。按换台键或者声音键都会没有反应。

常规写法

public class TvControler {    boolean tvIsOn = true;    public static void main(String[] args) {        TvControler controler = new TvControler();        System.out.println("电视机开着的时候可以:======================");        controler.setTvOn();        controler.setTvOff();        controler.changeChannel();        controler.turnUpVoice();        System.out.println("电视机关闭的时候可以的时候可以:======================");        controler.tvIsOn = false;        controler.setTvOn();        controler.setTvOff();        controler.changeChannel();        controler.turnUpVoice();    }    /**     * 打开电视机     */    private void setTvOn() {        if (tvIsOn) {        } else {            System.out.println("电视机已经被打开");        }    }    /**     * 管壁电视机     */    private void setTvOff(){        if(tvIsOn){            System.out.println("电视机已经关闭");        }else{        }    }    /**     * 换台     */    private void changeChannel(){        if(tvIsOn){            System.out.println("已经切换节目");        }else{        }    }    /**     * 调大声音     */    private void turnUpVoice(){        if(tvIsOn){            System.out.println("声音已被调大");        }else{        }    }}

打印结果:
电视机开着的时候可以:======================
电视机已经关闭
已经切换节目
声音已被调大
电视机关闭的时候可以的时候可以:======================
电视机已经被打开

使用状态模式

/** * 定义电视机的所有方法 */public interface ITvStatus {    /**     * 打开电视     */    void turnOnTv();    /**     * 关闭电视     */    void turnOffTv();    /**     * 换台     */    void changeChannel();    /**     * 调大声音     */    void turnUpVoice();}
/** * 电视机处于关闭状态 */public class TvStatusOff implements ITvStatus{    public void turnOnTv() {        System.out.println("电视机已被打开");    }    public void turnOffTv() {    }    public void changeChannel() {    }    public void turnUpVoice() {    }}
/** * 电视机处于开启状态 */public class TvStatusOn implements ITvStatus{    public void turnOnTv() {    }    public void turnOffTv() {        System.out.println("电视机已经关闭");    }    public void changeChannel() {        System.out.println("已经换台");    }    public void turnUpVoice() {        System.out.println("已经调高声音");    }}
public class Context {    private ITvStatus tvStatus;    public static void main(String[] args) {        Context context = new Context();        context.setTvStatus(new TvStatusOff());        System.out.println("现在电视机处于关闭状态================");        context.tvStatus.turnOnTv();        context.tvStatus.turnOffTv();        context.tvStatus.changeChannel();        context.tvStatus.turnUpVoice();        context.setTvStatus(new TvStatusOn());        System.out.println("现在电视机处于开启状态================");        context.tvStatus.turnOnTv();        context.tvStatus.turnOffTv();        context.tvStatus.changeChannel();        context.tvStatus.turnUpVoice();    }    public void setTvStatus(ITvStatus tvStatus) {        this.tvStatus = tvStatus;    }}

打印结果
现在电视机处于关闭状态================
电视机已被打开
现在电视机处于开启状态================
电视机已经关闭
已经换台
已经调高声音

由此可见,使用状态模式能够提高代码的扩展性。并且阅读起来更直接明了省去了if-else的判断。对于状态更多的比如三种四种,效果更明显。

0 0