• State(状态模式)


    状态模式

    在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。

    在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。

    UML结构图

    在这里插入图片描述

    • Context:环境类,可以包括一些内部状态,维护一个State对象,他是定义了当前的状态。
    • State:抽象状态类,定义了所有具体状态的共同接口,任何状态都需要实现这个接口,从而实现状态间的互相转换
    • ConcreteState:具体状态类,处理来自 Context 的请求,每一个 ConcreteState
      都提供了它对自己请求的实现,所以,当 Context 改变状态时行为也会跟着改变

    代码实现

    抽象状态类

    	package com.lq.state;
    	
    	/**
    	 * @author lq
    	 * @PACKAGE_NAME: com.lq.state
    	 * @CLASS_NAME: State
    	 * @date 2022/11/14 21:45
    	 * @Description:
    	 */
    	public interface State {
    	    /**
    	     * 操控
    	     */
    	    void handle();
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    具体状态类

    	public class BookedState implements State{
    	    @Override
    	    public void handle() {
    	        System.out.println("房间已预订!别人不能定!");
    	    }
    	}
    
    	class CheckedState implements State{
    	    @Override
    	    public void handle() {
    	        System.out.println("房间已入住!请勿打扰!");
    	    }
    	}
    	
    	
    	class FreeState implements State{
    	
    	    @Override
    	    public void handle() {
    	        System.out.println("房间空闲!!!没人住!");
    	    }
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    环境类

    	/**
    	 * @author lq
    	 * @PACKAGE_NAME: com.lq.state
    	 * @CLASS_NAME: HomeContext
    	 * @date 2022/11/14 21:47
    	 * @Description:
    	 */
    	public class HomeContext {
    	
    	    private State state;
    	
    	    public void setState(State s){
    	        System.out.println("修改状态!");
    	        state = s;
    	        state.handle();
    	    }
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    测试

    	/**
    	 * @author lq
    	 * @PACKAGE_NAME: com.lq.state
    	 * @CLASS_NAME: Main
    	 * @date 2022/11/14 21:47
    	 * @Description:
    	 */
    	public class Main {
    	    public static void main(String[] args) {
    	        // 获取房间对象
    	        HomeContext ctx = new HomeContext();
    	        // 设置房间状态
    	        ctx.setState(new FreeState());
    	        ctx.setState(new BookedState());
    	    }
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    输出

    	修改状态!
    	房间空闲!!!没人住!
    	修改状态!
    	房间已预订!别人不能定!
    
    • 1
    • 2
    • 3
    • 4

    总结状态模式

    优点

    1. 封装了转换规则,允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块
    2. 将所有与状态有关的行为放到一个类中,可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。

    缺点

    1. 需要在枚举状态之前需要确定状态种类
    2. 会导致增加系统类和对象的个数。
    3. 对 “开闭原则” 的支持并不友好,新增状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码。
  • 相关阅读:
    dynamic-datasource + parallelStream数据源切换失效
    【2022国赛模拟】[SDSC Day5] 毒药——自适应交互、DP
    DA4 统计网站部分用户使用语言
    某银行客户Db2下移分布式数据库OceanBase案例
    SpringBoot 整合 RabbitMQ 消息过期 TTL、死信队列 (三) 有图 有源码
    竞赛 推荐系统设计与实现 协同过滤推荐算法
    主流电商平台价格如何高频监测
    Spring及SpringMvc
    SVD奇异值分解原理及应用
    Qt+GDAL开发笔记(二):在windows系统msvc207x64编译GDAL库、搭建开发环境和基础Demo
  • 原文地址:https://blog.csdn.net/qq_45376284/article/details/127856259