当前位置: 首页 > news >正文

设计模式 -- 状态模式(State Pattern)

状态模式:类的行为基于它的状态改变 属于行为型模式,创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。在代码中包含大量与对象状态有关的条件语句可以通过此模式将各种具体的状态类抽象出来

介绍
  • 意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
  • 主要解决问题:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。
  • 关键代码:通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法。而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。状态模式和命令模式一样,也可以用于消除 if...else 等条件选择语句。
  • 优点:1、封装了转换规则。 2、枚举可能的状态,在枚举状态之前需要确定状态种类。 3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。
  • 缺点:1、状态模式的使用必然会增加系统类和对象的个数。 2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。 3、状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。
示例

以图形状态 三角形、圆形、矩形为例:

  1. 创建一个接口
    public interface State { void doAction(Shape shape);String toStr();
    }
  2. 创建 Shape类。
    public class Shape {private State state;public State getState() {return state;}public void setState(State state) {this.state = state;}
    }
  3. 创建实现接口的实体类
    三角形状态
    public class TriangleState implements State{@Overridepublic void doAction(Shape shape) {shape.setState(this);}@Overridepublic String toStr(){return "三角形";}
    }
    圆形状态
    public class CircularState implements State{@Overridepublic void doAction(Shape shape) {shape.setState(this);}@Overridepublic String toStr(){return "圆形";}
    }
    矩形状态
    public class RectangleState implements State{@Overridepublic void doAction(Shape shape) {shape.setState(this);}@Overridepublic String toStr(){return "矩形";}
    }
  4. 使用
        public static void main(String[] args) {Shape shape = new Shape();TriangleState triangleState = new TriangleState();triangleState.doAction(shape);String state =  shape.getState().toStr();//三角形CircularState circularState = new CircularState();circularState.doAction(shape);state =  shape.getState().toStr();//圆形RectangleState rectangleState = new RectangleState();rectangleState.doAction(shape);state =  shape.getState().toStr();//矩形}

http://www.lryc.cn/news/223805.html

相关文章:

  • qt quick发布程序启动失败
  • nginx反向代理报错合集
  • 【Linux精讲系列】——vim详解
  • 微信小程序自动化采集方案
  • 操作系统第三章王道习题_内存管理_总结易错知识点
  • uniapp刻度尺的实现(swiper)滑动打分器
  • cordova Xcode打包ios以及发布流程(ionic3适用)
  • idea中的.idea文件夹以及*.iml文件(新版idea没有*.iml文件了),新旧版idea打开同一个项目会不会出现不兼容
  • 高性能网络编程 - The C10K problem 以及 网络编程技术角度的解决思路
  • uniapp u-tabs表单如何默认选中
  • 2023年腾讯云双11活动入口在哪里?
  • Windows 下编译 TensorFlow 2.12.0 CC库
  • Spring Boot 中自动装配机制的原理
  • 如何安装Wnmp并结合内网穿透实现外网访问内网Wnmp服务
  • 网工内推 | 上市公司,云平台运维,IP认证优先,13薪
  • Linux安装DMETL4
  • Python中编码声明的方法
  • css设置浏览器表单自动填充时的背景
  • windows系统下查看安卓apk的sha1
  • openGauss学习笔记-116 openGauss 数据库管理-设置数据库审计-审计概述
  • python编程复习系列——week2(Input Output (2))
  • 为什么HTTP用得很好的,开始普及HTTPS呢?
  • C++day6作业
  • 【 毕设项目源码推荐 javaweb 项目】 基于 springboot+vue 的图书个性化推荐系统的设计与实现(springboot003)
  • FFmpeg编译hevc版本,支持mac、linux系统
  • AI系统ChatGPT程序源码+AI绘画系统源码+支持GPT4.0+Midjourney绘画+已支持OpenAI GPT全模型+国内AI全模型
  • Unity 3D 调整cube的颜色
  • 数字通信和fpga概述——杜勇版本学习笔记
  • 17.复制字符串 ,包括\0
  • C# List<T>.IndexOf()方法的使用