设计模式学习总结(二十三)-状态模式(设计模式之状态模式)
温馨提示:这篇文章已超过504天没有更新,请注意相关的内容是否还可用!
设计模式学习总结(二十三)-状态模式及设计模式之状态模式在软件开发过程中,状态是一个非常重要的概念。在某些情况下,我们需要根据不同的状态来执行不同的操作。状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改变它的行为。状态模式将状态和行为分离开来,使得状态转换更加灵活,同时也降低了对象间的耦合度。状态模式的实现方式有两种:基于接口和基于继承。在状态模式中,有三个角色:环境类、抽象状态类和具体状态类。下面以一个简单的电梯控制系统为例来介绍状态模式的应用。
设计模式学习总结(二十三)-状态模式及设计模式之状态模式
在软件开发过程中,状态是一个非常重要的概念。在某些情况下,我们需要根据不同的状态来执行不同的操作。这时,状态模式就可以派上用场了。
状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改变它的行为。状态模式将状态和行为分离开来,使得状态转换更加灵活,同时也降低了对象间的耦合度。
状态模式的核心思想是:将对象的状态以及状态对应的行为封装成单独的类,当对象的状态发生改变时,它所对应的行为也会相应地发生改变。
状态模式的实现方式有两种:基于接口和基于继承。基于接口的实现方式通常使用抽象状态类和具体状态类实现,而基于继承的实现方式则使用一个状态类继承自另一个状态类。
在状态模式中,有三个角色:环境类、抽象状态类和具体状态类。其中,环境类是拥有状态的对象,抽象状态类定义了状态的接口,具体状态类实现了具体的状态。
下面以一个简单的电梯控制系统为例来介绍状态模式的应用。
首先,我们需要定义一个抽象状态类,它包含了电梯状态所对应的方法:
```
public abstract class ElevatorState {
public abstract void open();
public abstract void close();
public abstract void run();
public abstract void stop();
}
```
然后,我们定义具体的状态类,分别为门开、门关、上行和下行:
```
public class OpenState extends ElevatorState {
@Override
public void open() {
System.out.println("电梯门已经打开");
}
@Override
public void close() {
System.out.println("电梯门关闭");
super.context.setElevatorState(Context.closeState);
super.context.getElevatorState().close();
}
@Override
public void run() {
System.out.println("电梯门还没关,不能运行");
}
@Override
public void stop() {
System.out.println("电梯门还没关,不能停止");
}
}
public class CloseState extends ElevatorState {
@Override
public void open() {
System.out.println("电梯门打开");
super.context.setElevatorState(Context.openState);
super.context.getElevatorState().open();
}
@Override
public void close() {
System.out.println("电梯门已经关闭");
}
@Override
public void run() {
System.out.println("电梯开始上行");
super.context.setElevatorState(Context.upState);
super.context.getElevatorState().run();
}
@Override
public void stop() {
System.out.println("电梯已经停止");
}
}
public class UpState extends ElevatorState {
@Override
public void open() {
System.out.println("电梯正在上行,不能开门");
}
@Override
public void close() {
System.out.println("电梯正在上行,不能关门");
}
@Override
public void run() {
System.out.println("电梯正在上行");
}
@Override
public void stop() {
System.out.println("电梯已经停止");
super.context.setElevatorState(Context.stopState);
super.context.getElevatorState().stop();
}
}
public class DownState extends ElevatorState {
@Override
public void open() {
System.out.println("电梯正在下行,不能开门");
}
@Override
public void close() {
System.out.println("电梯正在下行,不能关门");
}
@Override
public void run() {
System.out.println("电梯正在下行");
}
@Override
public void stop() {
System.out.println("电梯已经停止");
super.context.setElevatorState(Context.stopState);
super.context.getElevatorState().stop();
}
}
```
最后,我们定义一个环境类Context,它包含了当前状态和状态的切换:
```
public class Context {
public static final OpenState openState = new OpenState();
public static final CloseState closeState = new CloseState();
public static final UpState upState = new UpState();
public static final DownState downState = new DownState();
public static final StopState stopState = new StopState();
private ElevatorState elevatorState;
public void setElevatorState(ElevatorState elevatorState) {
this.elevatorState = elevatorState;
this.elevatorState.setContext(this);
}
public ElevatorState getElevatorState() {
return this.elevatorState;
}
public void open() {
this.elevatorState.open();
}
public void close() {
this.elevatorState.close();
}
public void run() {
有云计算,存储需求就上慈云数据:点我进入领取200元优惠券