概念:对象的状态发生改变的时候,行为也跟着相应的改变
封装的思想:
环境类又称为上下文类,它是拥有多种状态的对象。由于环境类的状态存在多样性且在不同状态下对象的行为有所不同,因此将状态独立出去形成单独的状态类。在环境类中维护一个抽象状态类State的实例,这个实例定义当前状态,在具体实现时,它是一个State子类的对象。
抽象状态类:它用于定义一个接口以封装与环境类的一个特定状态相关的行为,在抽象状态类中声明了各种不同状态对应的方法,而在其子类中实现类这些方法,由于不同状态下对象的行为可能不同,因此在不同子类中方法的实现可能存在不同,相同的方法可以写在抽象状态类中。
具体状态类:它是抽象状态类的子类,每一个子类实现一个与环境类的一个状态相关的行为,每一个具体状态类对应环境的一个具体状态,不同的具体状态类其行为有所不同。
package state;
/** 一种状态对应一种行为对应一个具体状态类
* 首先 要知道有三种角色充当 抽象状态角色 环境角色 具体状态角色
* 抽象状态角色 包含 一个内置环境角色 和多个抽象行为(要执行的方法)
* 环境角色 包含一个内置抽象状态角色 多个具体状态类成员变量 多个执行行为
* 具体角色 实现父类的方法(一个是自己该状态下要做的事 还有别的方法就是状态的切换)
*
* @Classname StateClassDemo2
* @Description 控制水的状态
* @Date 2021/3/21 17:32
* @Created by 86386
*/
public abstract class StateClassDemo2 {
//环境角色
protected ContextDemo contextDemo;
public ContextDemo getContextDemo() {
return contextDemo;
}
public void setContextDemo(ContextDemo contextDemo) {
this.contextDemo = contextDemo;
}
public abstract void handle1();
public abstract void handle2();
public abstract void handle3();
}
class ContextDemo{
public static final StateClassDemo2 waterState=new WaterClass();
public static final StateClassDemo2 steamState=new SteamClass();
public static final StateClassDemo2 iceState=new IceClass();
private StateClassDemo2 stateClassDemo2;
public StateClassDemo2 getStateClassDemo2() {
return stateClassDemo2;
}
public void setStateClassDemo2(StateClassDemo2 stateClassDemo2) {
this.stateClassDemo2 = stateClassDemo2;
//切换状态
this.stateClassDemo2.setContextDemo(this);
}
//这是水的状态
public void handle1() {
stateClassDemo2.handle1();
}
//转换为气的状态
public void handle2() {
stateClassDemo2.handle2();
}
//转换为冰的状态
public void handle3() {
stateClassDemo2.handle3();
}
}
class WaterClass extends StateClassDemo2{
//这是水的状态
@Override
public void handle1() {
System.out.println("这是水的状态");
}
//转换为气的状态
@Override
public void handle2() {
super.contextDemo.setStateClassDemo2(ContextDemo.steamState);
//过渡到steamState状态,由Context实现;
super.contextDemo.handle2();
}
//转换为冰的状态
@Override
public void handle3() {
super.contextDemo.setStateClassDemo2(ContextDemo.iceState);
//过渡到iceState状态,由Context实现;
super.contextDemo.handle3();
}
}
class IceClass extends StateClassDemo2{
@Override
public void handle1() {
super.contextDemo.setStateClassDemo2(ContextDemo.waterState);
//过渡到waterState状态,由Context实现;
super.contextDemo.handle1();
}
@Override
public void handle2() {
super.contextDemo.setStateClassDemo2(ContextDemo.steamState);
//过渡到steamState状态,由Context实现;
super.contextDemo.handle3();
}
@Override
public void handle3() {
System.out.println("这是冰的状态");
}
}
class SteamClass extends StateClassDemo2{
@Override
public void handle1() {
super.contextDemo.setStateClassDemo2(ContextDemo.waterState);
//过渡到waterState状态,由Context实现;
super.contextDemo.handle2();
}
@Override
public void handle2() {
System.out.println("这是水蒸气的状态");
}
@Override
public void handle3() {
super.contextDemo.setStateClassDemo2(ContextDemo.iceState);
//过渡到iceState状态,由Context实现;
super.contextDemo.handle3();
}
}
class testDemo{
public static void main(String[] args) {
ContextDemo contextDemo=new ContextDemo();
contextDemo.setStateClassDemo2(ContextDemo.iceState);
contextDemo.handle1();
contextDemo.handle2();
contextDemo.handle3();
}
}