笨蛋学设计模式行为型模式-状态模式【20】

这篇具有很好参考价值的文章主要介绍了笨蛋学设计模式行为型模式-状态模式【20】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

8.7状态模式

8.7.1概念

​ 状态模式是指对象在运行时可以根据内部状态的不同而改变它们的行为,该模式将内部状态的行为封装为不同的具体状态类中,并将状态转换逻辑委托给这些状态类来处理,当对象的内部状态发生变化时,它会自动切换到对应的状态类,从而改变其行为。

8.7.2场景

​ 比如在设计一个电梯系统时,可以使用状态模式来管理电梯的不同状态,如开门、关门、上升、下降等。将电梯的这几种状态封装成一个独立的状态类,并定义了该状态下的具体行为,通过将状态切换的逻辑分布到各个状态类中,可以使得电梯的状态切换更加清晰、易于维护和扩展。

8.7.3优势 / 劣势

  • 代码结构清晰:将每个状态切换的逻辑都封装到各个独立的状态类中,使得代码更加清晰
  • 遵循开闭原则:通过新增一个新的状态类,可以轻松地扩展系统的功能

  • 代码可能过于冗余:若状态类过多或者状态转移过于复杂,会导致系统的类数量增加
  • 过于抽象:状态模式比较抽象,不太容易理解

8.7.4状态模式可分为

  • 状态State:定义一个接口,用于封装与Context的一个特定状态相关的行为
  • 具体状态ConcreteState:负责处理Context在状态改变时的行为,每一个具体状态子类实现一个与Context的一个状态相关的行为
  • 上下文Context:维护一个具体状态子类的实例,这个实例定义当前的状态

8.7.5状态模式

package com.technologystatck.designpattern.mode.state;

public class States {
    public static void main(String[] args) {
        Context context = new Context();
        State state1 = new ConcreteState1();
        State state2 = new ConcreteState2();

        context.setState(state1);
        //执行在状态1下的操作
        context.request();

        context.setState(state2);
        //执行在状态2下的操作
        context.request();
        
    }
}

//定义状态接口
interface State{
    void handle();
}

//实现具体状态类:为对象可能的每种状态创建具体的状态类,
//实现状态接口中定义的方法

//具体状态类1
class ConcreteState1 implements State{

    @Override
    public void handle() {
        //执行在状态1下的操作
        System.out.println("执行在状态1下的操作");
    }
}
//具体状态类2
class ConcreteState2 implements State{

    @Override
    public void handle() {
        //执行在状态2下的操作
        System.out.println("执行在状态2下的操作");
    }
}
//创建上下文类:该类包含对状态的引用,并在需要时调用当前状态的方法
class Context{
    private State currentState;

    //根据不同的状态类,调用不同的状态类方法
    public void setState(State state){
        this.currentState=state;
    }

    public void request(){
        currentState.handle();  //调用状态对象中的方法,完成状态的转换
    }
}

8.7.6实战

8.7.6.1题目描述

小明家有一个灯泡,刚开始为关闭状态(OffState)。台灯可以接收一系列的指令,包括打开(“ON”)、关闭(“OFF”)和闪烁(“blink”)。每次接收到一个指令后,台灯会执行相应的操作,并输出当前灯泡的状态。请设计一个程序模拟这个灯泡系统。

8.7.6.2输入描述

第一行是一个整数 n(1 <= n <= 1000),表示接收的命令数量。

接下来的 n 行,每行包含一个字符串 s,表示一个命令(“ON”、“OFF"或"blink”)。

8.7.6.3输出描述

对于每个命令,输出一行,表示执行该命令后灯泡的状态。文章来源地址https://www.toymoban.com/news/detail-817440.html

8.7.6.4代码
package com.technologystatck.designpattern.mode.state;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int nums = scanner.nextInt();
        scanner.nextLine();

        //实例化灯泡类
        Light light = new Light();

        for (int i = 0; i < nums; i++) {
            String command = scanner.nextLine().trim();

            //根据输入修改灯的状态
            switch (command) {
                //根据不同的状态使用不同的灯泡
                case "ON":
                    light.setState(new OnBulbState());
                    break;
                case "OFF":
                    light.setState(new OffBulbState());
                    break;
                case "BLINK":
                    light.setState(new BlinkBulbState());
                    break;
                default:
                    System.out.println("Invalid command: "+command);
                    break;
            }
            //显示灯的当前状态
            System.out.println(light.performOperation());
        }
    }
}


//定义状态接口
interface TableLampState {
    String handle();
}

//定义具体的状态类
//打开台灯
class OnBulbState implements TableLampState {

    @Override
    public String handle() {
        return "Light is ON";
    }
}

//关闭台灯
class OffBulbState implements TableLampState {

    @Override
    public String handle() {
        return "Light is OFF";
    }
}

//台灯闪烁
class BlinkBulbState implements TableLampState {

    @Override
    public String handle() {
        return "Light is Blink";
    }
}

//上下文类
class Light {
    //当前状态类的状态
    private TableLampState state;

    public Light() {
        //初始状态为关闭
        this.state = new OffBulbState();
    }

    //设置新的状态

    public void setState(TableLampState state) {
        this.state = state;
    }

    //执行状态转换
    public String performOperation() {
        return state.handle();
    }
}

8.7.7总结

  • 优点:状态模式使的代码结构更加清晰化,同时更方便我们对代码结构进行扩展
  • 总结:将对象的每个状态封装成一个类,通过给类增加对应状态的行为,来实现对象的状态操作
  • 场景:适用于有限状态机的场景,其中对象的行为在运行时可以根据内部的状态改变而改变

到了这里,关于笨蛋学设计模式行为型模式-状态模式【20】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 笨蛋学设计模式行为型模式-备忘录模式【22】

    8.9.1概念 ​ 备忘录模式允许在不暴露对象实现细节的情况下捕获和恢复对象的内部状态。通过将对象的状态封装在备忘录对象中,并将备忘录对象保存在一个管理者对象中,可以在需要时回滚到对象之前的状态。 8.9.2场景 ​ 在现代办公场景中,备忘录模式可以应用于文档编

    2024年01月25日
    浏览(42)
  • 笨蛋学设计模式行为型模式-访问者模式【21】

    8.8.1概念 ​ 访问者模式是一种将操作逻辑与对象结构分离的方法,使得操作可以独立变化,操作逻辑被封装在独立的访问者类中,并在被访问的元素类中提供接受访问者的方法,而不是直接嵌入到数据结构中的对象中。 8.8.2场景 ​ 我们可以将一个购物商场中的商品类作为元

    2024年01月23日
    浏览(54)
  • 【十五】设计模式~~~行为型模式~~~状态模式(Java)

    【学习难度:★★★☆☆,使用频率:★★★☆☆】 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互

    2024年02月07日
    浏览(50)
  • 【Java 设计模式】行为型之状态模式

    状态模式(State Pattern)是一种行为型设计模式,用于通过将对象的行为封装到不同的状态类中,使得对象在不同的状态下具有不同的行为。状态模式允许对象在内部状态发生改变时改变其行为,而无需修改其代码。在本文中,我们将深入研究Java中状态模式的定义、结构、使

    2024年01月24日
    浏览(52)
  • Java设计模式之行为型-状态模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类,状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不

    2024年02月16日
    浏览(40)
  • 设计模式行为型-状态模式

    状态模式是一种行为型设计模式,用于处理对象在不同状态下的行为变化。它将对象的行为封装在不同状态类中,通过状态的切换实现不同行为的触发。 本文将介绍状态模式的基本概念、应用场景以及优势与适用性。 实现具体状态类 具体工作类: 上下文类包含状态对象的引

    2024年02月10日
    浏览(40)
  • 行为型设计模式——状态模式

    状态模式是比较简单的设计模式,它的主要作用是减少代码中大量的 if-else 或者 switch-case 等逻辑判断(俗称屎山)。它将每个状态定义为一个类,而每个状态类有自己对应的方法,因此当需要根据状态执行逻辑代码时不需要写大量的if-else判断是哪个状态然后执行对应的逻辑

    2024年02月02日
    浏览(50)
  • 设计模式行为型——状态模式

      目录 状态模式的定义 状态模式的实现 状态模式角色 状态模式类图 状态模式举例 状态模式代码实现 状态模式的特点 优点 缺点 使用场景 注意事项 实际应用        在软件开发过程中,应用程序中的部分对象可能会根据不同的情况做出不同的行为,把这种对象称为有状态

    2024年02月14日
    浏览(40)
  • 设计模式—行为型模式之状态模式

    状态(State)模式:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。 状态模式包含以下主要角色: 环境类(Context)角色:也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具

    2024年01月15日
    浏览(36)
  • 【地铁上的设计模式】--行为型模式:状态模式

    什么是状态模式 状态模式是一种行为模式,它允许对象在其内部状态发生改变时改变其行为。在状态模式中,将状态定义为独立的对象,并将对象在不同状态下的行为委托给具有相应行为的状态对象。当对象的状态发生变化时,它将使用不同的状态对象来执行不同的操作,从

    2024年02月04日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包