一、定义
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
二、角色
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();
}
}
打印结果
开机
关机
请先开机
开机
上一个频道