专栏首页Vincent-yuan设计模式~状态模式

设计模式~状态模式

状态模式(State Pattern),又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。

状态模式允许一个对象在其内部状态改变的时候改变其行为。

状态模式的结构

状态模式把所研究对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的子类。

状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。

模式所涉及的角色有:

  • 抽象状态角色(State):定义一个接口,用以封装环境对象(Context)的一个特定的状态所对应的行为。
  • 具体状态角色(ConcreteState): 每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。
  • 环境角色(Context): 定义客户端所感兴趣的接口,并保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。

代码清单

环境类Context

public class Context {

    private State state;
    public void sampleOperation(){
        state.sampleOperation();
    }
    public void setState(State state){
        this.state = state;
    }
}

可以看出,环境类持有一个State对象,并把所有的行为委派给此对象。

抽象状态State接口

public interface State {

    void sampleOperation();
}

这个接口规范了所有实现此接口的子类,要求他们都实现方法sampleOperation()

具体状态类ConcreteState

public class ConcreteState implements State {

    @Override
    public void sampleOperation() {
        
    }
}

状态模式的效果

  1.状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。

  2. 由于每一个状态都被包装到了类里面,就可以不必采用过程性的处理方式,使用长篇累牍的条件转移语句。

  3. 使用状态模式使系统状态的变化变的很明显。由于不用一些属性(内部变量)来指明系统所处的状态,因此,就不用担心修改这些属性不当而造成的错误。

  4. 可以在系统的不同部分使用相同的一些状态类的对象。这种共享对象的办法是与享元模式相符合的。事实上,此时这些状态对象基本上是只有行为而没有内部状态的享元模式。

  5. 状态模式的缺点是会造成大量小的状态类;优点是使程序免于大量的条件转移语句,使程序实际上更易于维护。

  6. 系统所选的状态子类均是从一个抽象状态类或接口继承而来,Java语言的特性使得在Java语言中使用状态模式较为安全。多态性原则是状态模式的核心。

在什么情况下使用状态模式

  1. 一个对象的行为依赖于它所处的状态,对象的行为必须随着其状态的改变而改变。

  2. 对象在某个方法里依赖于一重或多重的条件转移语句,其中有大量的代码。状态模式把条件转移语句的每一个分支都包装到一个单独的类里。这使得这些条件转移分支能够以类的方式独立的存在和演化。维护这些独立的类也就不再影响到系统的其他部分。

一个状态模式应用的例子:TCP

这是一个状态模式的经典例子。

考虑由TcpConnection代表一个TCP/IP网络的连接。

一个TcpConnection对象可以取几个可能的状态之一:Establised(已建立连接)、Listening(聆听)和Closed(关闭)。

当TcpConnection对象接到其他对象的请求时,会根据其状态不同而给出不同的回应。

比如说,TcpConnection回应客户端的开启请求取决于TcpConnection的状态是Establised还是Closed。

状态模式描述了TcpConnection在它的状态下是怎样行动的。

  在此系统中,使用状态模式的关键是引进了一个抽象类或接口TcpState来代表网络的连接状态。

抽象类或接口TcpState限定了所有的表示不同行为的状态,它的子类实现了由状态决定的行为。

比如,TcpEstablished和TcpClosed类分别实现了对应于Established和Closed状态的行为。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java之hibernate之session中对象的生命周期

    1. session是用来执行对象的crud操作,并且session是对象事务工厂。session是线程级别的,所以生命周期比较短。

    Vincent-yuan
  • 设计模式~单例模式

    单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

    Vincent-yuan
  • java之springboot之快速入门(一)- maven方式创建项目

    Application类是应用启动类,注意此类要放在package下面,这里是放在com.vincent.demo1包下,如果直接放在java目录下,之后启动...

    Vincent-yuan
  • 【每日算法Day 61】LeetCode 672. 灯泡开关 Ⅱ

    现有一个房间,墙上挂有 只已经打开的灯泡和 个按钮。在进行了 次未知操作后,你需要返回这 只灯泡可能有多少种不同的状态。

    godweiyang
  • 学以致用C++设计模式 之 “状态模式”

    要开发一款游戏,咱负责的模块是处理游戏角色属性框架的搭建,目前已知角色有:坦克、法师、射手,他们都有属性:血量、物攻、物抗、法攻、法抗、角色转换技能。

    看、未来
  • 书写高质量代码之状态维护

    状态之始 我们第一眼接触新事物所触发的思考方式,决定了以后我们看待这样事物的角度,进而影响更深层次的理解和行为。 编程相对于人类历史的进程而言,不过是个六七岁孩...

    用户1289394
  • 研究全脑神经网络时间动态的工具:脑电微状态介绍

    瑞士研究者Christoph M.Michel 和ThomasKoenig在NeuroImage发文,介绍了一种用多通道EEG表征人脑静息态活动的办法。...

    用户1279583
  • 前端状态管理设计——优雅与妥协的艺术

    如果我仍然去解释什么是状态管理器,为什么我们需要它,这篇文章将会索然无味。我的想法是,我们原本不需要状态管理器,但我们确实需要状态管理。

    否子戈
  • java设计模式之状态模式,策略模式的孪生兄弟

    状态模式(State Pattern)中,类的行为是基于它的状态改变的,状态之间的切换,在状态A执行完毕后自己控制状态指向状态B,状态模式是不停的切换状态执行,...

    用户4361942
  • 状态模式(分离状态,选择实现)

    如果您是第一次阅读我的设计模式系列文章,建议先阅读设计模式开篇,希望能得到您宝贵的建议。

    幺鹿

扫码关注云+社区

领取腾讯云代金券