案列
电梯在不同状态下的业务逻辑以及状态的切换
设计图
代码
1.抽象状态类
/**
* Created by Administrator on 2019/4/6.
* 电梯状态抽象类,定义状态的模板方法,引用电梯的上下文环境类实现类的状态的切换。
*/
public abstract class IliftState {
protected StateContext stateContext;
public void setStateContext(StateContext stateContext) {
this.stateContext = stateContext;
}
public abstract void stop();
public abstract void start();
public abstract void open();
public abstract void close();
}
2.开启状态
/**
* Created by Administrator on 2019/4/6.
*/
public class OpenState extends IliftState {
@Override
public void stop() {
}
@Override
public void start() {
}
@Override
public void open() {
System.out.println("电梯打开");
}
@Override
public void close() {
super.stateContext.setLiftState(StateContext.closeState);
super.stateContext.close();
}
}
3.关闭状态
/**
* Created by Administrator on 2019/4/6.
*/
public class CloseState extends IliftState{
@Override
public void stop() {
super.stateContext.setLiftState(StateContext.stopState);
super.stateContext.stop();
}
@Override
public void start() {
super.stateContext.setLiftState(StateContext.startState);
super.stateContext.start();
}
@Override
public void open() {
super.stateContext.setLiftState(StateContext.openState);
super.stateContext.open();
}
@Override
public void close() {
System.out.println("电梯关门了");
}
}
4.启动状态
/**
* Created by Administrator on 2019/4/6.
*/
public class StartState extends IliftState{
@Override
public void stop() {
super.stateContext.setLiftState(StateContext.stopState);
super.stateContext.stop();
}
@Override
public void start() {
System.out.println("电梯启动了");
}
@Override
public void open() {
}
@Override
public void close() {
}
}
5.停止状态
/**
* Created by Administrator on 2019/4/6.
* 停止状态,可切换到开启状态、关闭状态和启动状态
*/
public class StopState extends IliftState{
@Override
public void stop() {
System.out.println("电梯停了");
}
@Override
public void start() {
super.stateContext.setLiftState(StateContext.startState);
super.stateContext.start();
}
@Override
public void open() {
super.stateContext.setLiftState(StateContext.openState);
super.stateContext.open();
}
@Override
public void close() {
super.stateContext.setLiftState(StateContext.closeState);
super.stateContext.close();
}
}
5.状态环境类
/**
* Created by Administrator on 2019/4/6.
* 状态模式的环境角色类,负责状态切换,类似于工作流中的状态机。
* 状态机会实现状态类中的所有方法,具体实现委托给对应的状态实现。
* 默认会给一个初始状态
*/
public class StateContext {
public final static StopState stopState=new StopState();
public final static StartState startState=new StartState();
public final static OpenState openState=new OpenState();
public final static CloseState closeState=new CloseState();
//需要初始化一个状态
private IliftState liftState;
public IliftState getLiftState() {
return liftState;
}
public void setLiftState(IliftState liftState) {
this.liftState = liftState;
//切换状态的依赖,将环境传递到各个状态的类中去。
this.liftState.setStateContext(this);
}
public void stop(){
liftState.stop();
}
public void start(){
liftState.start();
}
public void close(){
liftState.close();
}
public void open(){
liftState.open();
}
}
6.场景类
/**
* Created by Administrator on 2019/4/6.
* 状态模式只有一个问题,就是类膨胀的问题,其他的都封装的听会挺好。
* 封装状态的变化,状态的变化,
*/
public class Client {
public static void main(String[]args){
StateContext stateContext=new StateContext();
stateContext.setLiftState(new CloseState());
stateContext.close();
stateContext.start();
stateContext.stop();
stateContext.open();
}
}
7.运行结果
电梯关门了
电梯启动了
电梯停了
电梯打开
通用类图
1.含义:
对象的行为随着状态的变化而变化
2.设计图
3.角色说明
抽象状态类:引入状态环境类,定义两个方法,分别为本状态行为管理和趋向行为管理
具体状态类:实现抽象状态类,定义具体的几种状态
状态环境类:引入所有的具体状态,默认实现抽象状态类的所有方法,实现委托给具体的状态类,实现状态的切换。
4.代码
1.抽象状态类
/**
* Created by Administrator on 2019/4/6.
* 抽象状态类,引入状态环境类,定义两个方法,分别为本状态行为管理和趋向行为管理。
*/
public abstract class AbstractState {
protected StateContext stateContext;
public void setStateContext(StateContext stateContext) {
this.stateContext = stateContext;
}
public abstract void handle1();
public abstract void handle2();
}
2.具体状态1
/**
* Created by Administrator on 2019/4/6.
*/
public class ConcreteState1 extends AbstractState{
@Override
public void handle1() {
//本状态行为管理
}
@Override
public void handle2() {
super.stateContext.setAbstractState(StateContext.concreteState2);
super.stateContext.handle2();
}
}
3.具体状态2
/**
* Created by Administrator on 2019/4/6.
*/
public class ConcreteState2 extends AbstractState {
@Override
public void handle1() {
super.stateContext.setAbstractState(StateContext.concreteState1);
super.stateContext.handle1();
}
@Override
public void handle2() {
//本状态行为管理
}
}
4.状态环境类
/**
* Created by Administrator on 2019/4/6.
*/
public class StateContext {
//状态对象默认为fianl和static的。
public final static ConcreteState1 concreteState1=new ConcreteState1();
public final static ConcreteState2 concreteState2=new ConcreteState2();
private AbstractState abstractState;
public AbstractState getAbstractState() {
return abstractState;
}
public void setAbstractState(AbstractState abstractState) {
this.abstractState = abstractState;
this.abstractState.setStateContext(this);
}
//默认实现状态中的所有方法,具体实现委托给状态类
public void handle1(){
abstractState.handle1();
};
public void handle2(){
abstractState.handle2();
};
}
优势
1.易扩展
使用场景
使用
网友评论