首页 > 其他分享 >状态模式(Sate Pattern)

状态模式(Sate Pattern)

时间:2023-05-22 20:23:57浏览次数:33  
标签:状态 转换 对象 Pattern 模式 State Sate public

一、模式动机

状态模式(State Pattern)是一种较为复杂的行为型模式。它用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。当系统中某个对象存在多个状态这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态从该对象中分离出来,使得其状态可以灵活变化,且对于客户端来说,用户无需关心对象状态的转换以及对象所处的当前状态,无论对于何种状态的对象,客户端都可以一致处理

类比:

  • 现实生活
    • 人有悲欢离合,每一种情绪对应着人的不同行为
  • 在软件系统中:
    • 有些对象具有多种状态
    • 这些状态在某些情况下能够相互转换
    • 对象在不同的状态下将具有不同的行为
  • 传统做法:使用复杂的条件判断语句来进行状态的判断和转换操作导致代码的可维护性和灵活性下降出现新的状态时,代码的扩展性很差,客户端代码需要进行相应的修改,违背了开闭原则

二、模式定义

  • 状态模式(State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。
  • 其别名为状态对象(Objects for States),状态模式是一种对象行为型模式

三、模式结构

image


环境类

public class Context {
   private State state; //维持一个对抽象状态对象的引用
    private int value;  //其他属性值,其变化可能会导致对象的状态变化
    public void setState(State state) {
        this.state = state;
    }
    public void request() {
        …
        state.handle( ); //调用状态对象的业务方法
      }
}

抽象状态类

public abstract class State {
    //声明抽象业务方法,不同的具体状态类可以有不同的实现
    public abstract void handle( );
}

具体状态类

public class ConcreteState extends State {
    public void handle( ) {
        //方法具体实现代码
    }
}

四、模式分析

  • 用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题
  • 将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化
  • 对于客户端而言,无须关心对象状态的转换以及对象所处的当前状态,无论对于何种状态的对象,客户端都可以一致处理

六、总结

模式优点

  • 封装了状态的转换规则,可以对状态转换代码进行集中管理,而不是分散在一个个业务方法中
  • 将所有与某个状态有关的行为放到一个类中,只需要注入一个不同的状态对象即可使环境对象拥有不同的行为
  • 允许状态转换逻辑与状态对象合成一体,而不是提供一个巨大的条件语句块,可以避免使用庞大的条件语句来将业务方法和状态转换代码交织在一起
  • 可让多个环境对象共享一个状态对象,从而减少系统中对象的个数

模式缺点

  • 会增加系统中类和对象的个数,导致系统运行开销增大
  • 结构与实现都较为复杂,如果使用不当将导致程序结构和代码混乱,增加系统设计的难度
  • 对开闭原则的支持并不太好,增加新的状态类需要修改负责状态转换的源代码,否则无法转换到新增状态;而且修改某个状态类的行为也需要修改对应类的源代码

使用情形

  • 对象的行为依赖于它的状态(例如某些属性值),状态的改变将导致行为的变化
  • 在代码中包含大量与对象状态有关的条件语句,这些条件语句的出现会导致代码的可维护性和灵活性变差,不能方便地增加和删除状态,并且导致客户类与类库之间的耦合增强

标签:状态,转换,对象,Pattern,模式,State,Sate,public
From: https://www.cnblogs.com/sorrymine/p/17421631.html

相关文章

  • 设计模式——访问者模式
    访问者模式(VisitorPattern)是GoF提出的23种设计模式中的一种,属于行为模式。据《大话设计模式》中说算是最复杂也是最难以理解的一种模式了。定义(源于GoF《DesignPattern》):表示一个作用于某对象结构中的各元素的操作。ClassVisitor和MethodVisitor都是访问者模式......
  • iOS GCD 和信号量 实现 生产者和消费者模式
    GCD提供两种方式支持dispatch队列同步,即dispatch组和信号量。一、dispatch组(dispatchgroup)1.创建dispatch组dispatch_group_tgroup=dispatch_group_create();2.启动dispatch队列中的block关联到group中dispatch_group_async(group,queue,^{//。。。});3.......
  • 观察者模式(Observer Pattern)
    一、模式动机观察者模式用于描述对象之间的依赖关系,它引入了观察者和观察目标两类不同的角色,由于提供了抽象层,它使得增加新的观察者和观察目标都很方便。观察者模式广泛应用于各种编程语言的事件处理模型中,Java语言也提供了对观察者模式的全面支持。一个对象的状态或行为的变......
  • 迭代器模式(Interator Pattern)
    一、模式动机迭代器模式(IteratorPattern)是一种使用频率非常高的行为型设计模式,迭代器用于对一个聚合对象进行遍历。通过引入迭代器可以将数据的遍历功能从聚合对象中分离出来,聚合对象只负责存储数据,而遍历数据由迭代器来完成,简化了聚合对象的设计,更符合“单一职责原则”的要求。......
  • 块、行元素的显示模式
    一、块元素CSS的元素显示模式常见的块元素有h1~h6、p、div、ul、ol、li等,其中div标签是最典型的块元素。1.1块元素块级元素的特点:①比较霸道,自己独占一行。②高度,宽度、外边距以及内边距都可以控制。③宽度默认是容器(父级宽度)的100%。④是一个容器及盒子,里面可以放......
  • 命令模式(Command Pattern)
    一、模式动机命令模式(CommandPattern)是一种常用的行为型设计模式,它将请求发送者与请求接收者解耦,请求发送者通过命令对象来间接引用接收者,使得系统具有更好的灵活性,可以在不修改现有系统源代码的情况下将相同的发送者对应不同的接收者,也可以将多个命令对象组合成宏命令,还可以在......
  • 读书笔记 软件需求模式
    前面了解到什么事需求的,接下来就应该学习如何使用和编写需求模式。我们不仅到了解需求模式的含义,更要学会在什么情况下使用需求模式。在定义系统期间,有两种场合使用需求模式:1.当定义需求时,看是否存在一个模式可以指导如何定义这种需求。2.当考虑系统需求是否完全时,浏览主题覆盖......
  • AIGC持续火爆大模型争相推出,庞大市场造就算力供应模式演变
    本图由AI生成  黄仁勋说的AI发展迎来iPhone时刻,对NVIDIA有什么影响?文/王吉伟 近期的AIGC领域仍旧火爆异常。但火的不只是AIGC应用,还有巨头之间的AI竞赛,以及接连不断上新的AI大模型(LLM,LargeLanguageModel)。面对ChatGPT带来的技术冲击,为了研发谷歌多模态AI模型及应对......
  • 行为型模式(Behavioer Pattern)
    行为型设计模式行为型模式定义了系统中对象之间的交互与通信,研究系统在运行时对象之间的相互通信与协作,进一步明确对象的职责,包括对系统中较为复杂的流程的控制。在软件系统运行时对象并不是孤立存在的,它们可以通过相互通信和协作完成某些功能,一个对象在运行时也将影响其他对象......
  • 代理模式(Proxy Pattern)
    一、模式动机通过引入一个新的对象(如小图片和远程代理对象)来实现对真实对象的操作,或者将新的对象作为真实对象的一个替身引入代理对象来间接访问一个对象二、模式定义给某一个对象提供一个代理,并由代理对象控制对原对象的引用对象结构型模式代理对象可以在客户端和目标对......