设计模式学习总结(二十三)-状态模式(设计模式之状态模式)

2023-03-28 1137阅读

温馨提示:这篇文章已超过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元优惠券
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]