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

2023-03-28 1140阅读

温馨提示:这篇文章已超过727天没有更新,请注意相关的内容是否还可用!

设计模式学习总结(二十三)-状态模式及设计模式之状态模式在软件开发过程中,状态是一个非常重要的概念。在某些情况下,我们需要根据不同的状态来执行不同的操作。状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改变它的行为。状态模式将状态和行为分离开来,使得状态转换更加灵活,同时也降低了对象间的耦合度。状态模式的实现方式有两种:基于接口和基于继承。在状态模式中,有三个角色:环境类、抽象状态类和具体状态类。下面以一个简单的电梯控制系统为例来介绍状态模式的应用。

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

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

在软件开发过程中,状态是一个非常重要的概念。在某些情况下,我们需要根据不同的状态来执行不同的操作。这时,状态模式就可以派上用场了。

状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改变它的行为。状态模式将状态和行为分离开来,使得状态转换更加灵活,同时也降低了对象间的耦合度。

状态模式的核心思想是:将对象的状态以及状态对应的行为封装成单独的类,当对象的状态发生改变时,它所对应的行为也会相应地发生改变。

状态模式的实现方式有两种:基于接口和基于继承。基于接口的实现方式通常使用抽象状态类和具体状态类实现,而基于继承的实现方式则使用一个状态类继承自另一个状态类。

在状态模式中,有三个角色:环境类、抽象状态类和具体状态类。其中,环境类是拥有状态的对象,抽象状态类定义了状态的接口,具体状态类实现了具体的状态。

下面以一个简单的电梯控制系统为例来介绍状态模式的应用。

首先,我们需要定义一个抽象状态类,它包含了电梯状态所对应的方法:

```

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购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]