Java设计模式之状态模式

来源:互联网 发布:nginx body filter 编辑:程序博客网 时间:2024/04/30 12:34

一、定义
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
二、角色
 1 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。

 2 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。

3 具体状态(Concrete State):实现抽象状态定义的接口。
三、以电视机开关控制为例,写一个demo
1、抽象状态

package com.example.state;/** * 抽象状态类 * @author zeng * */public interface TVState {    //开机    public void turnOn();    //关机    public void turnOff();    //下一个频道    public void nextChanel();    //上一个频道    public void preChanel();}

2.具体状态1

package com.example.state;public class PowerOn implements TVState {    @Override    public void turnOn() {        System.out.println("开机");    }    @Override    public void turnOff() {        System.out.println("关机");    }    @Override    public void nextChanel() {        System.out.println("下一个频道");    }    @Override    public void preChanel() {        System.out.println("上一个频道");    }}

3、具体状态2

package com.example.state;public class PowerOff implements TVState {    @Override    public void turnOn() {        System.out.println("开机");    }    @Override    public void turnOff() {        System.out.println("关机");    }    @Override    public void nextChanel() {        System.out.println("请先开机");    }    @Override    public void preChanel() {        System.out.println("请先开机");    }}

4、上下文环境,在此处是一个状态控制的管理器

package com.example.state;public class TVControl {    private TVState tvState;    private TVState turnOn,turnOff;    public TVControl() {        turnOn = new PowerOn();        turnOff = new PowerOff();    }    public void turnOn() {        tvState = turnOn;        tvState.turnOn();    }    public void turnOff() {        tvState = turnOff;        tvState.turnOff();    }    public void nextChanel() {        tvState.nextChanel();    }    public void preChanel() {        tvState.preChanel();    }}

5、客户类

package com.example.state;public class Client {    public static void main(String[] args) {        TVControl tvControl = new TVControl();        tvControl.turnOn();        tvControl.turnOff();        tvControl.nextChanel();        tvControl.turnOn();        tvControl.preChanel();    }}

打印结果

开机关机请先开机开机上一个频道
0 0
原创粉丝点击