前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >抽丝剥茧——状态设计模式

抽丝剥茧——状态设计模式

作者头像
石的三次方
发布2021-01-05 22:29:20
2150
发布2021-01-05 22:29:20
举报
文章被收录于专栏:石的三次方

兄弟们好,今天我们来学习一下状态设计模式。

它的定义是:「一个对象在不同的状态可以显示不同的动作,比如,在公司我们是打工人,在家里我们是老公,在教室我们是老师,因为我们的所处的环境不同而导致我们拥有不同的动作行为。这就是状态设计模式。」

我们在日常学习中这种状况很常见,比如TCP连接建立和销毁的过程,从不同的状态进行迁移,而表现出来的动作也不相同,又如一个线程的的状态,从五个状态不断地切换。

我们来看一下它的类图实现

通过TCPConnection状态的不断改变,引发其State状态的改变,因而导致其输出的结果改变。

我们来看一下它的角色组成:

  • Context,用户使用的对象,内部保存有该对象的状态
  • State,该对象的状态的抽象描述
  • ConcreteState,对象状态的具体描述

接下来我们来看一下它的代码实现:

Context

代码语言:javascript
复制
class TCPConnection{
    private State state ;

    public TCPConnection(State state){
        this.state = state ;
    }

    public void open(){
        state.open();
    }
    public void close(){
        state.close();
    }
}

State状态描述」

代码语言:javascript
复制
interface State{
    void open();
    void close();
}

「具体的状态描述」

代码语言:javascript
复制
class TCPEstablished implements State{

    @Override
    public void open() {
        System.out.println("当前状态为正在建立连接状态");
    }

    @Override
    public void close() {

    }
}

class TCPListened implements State{
    @Override
    public void open() {
        System.out.println("当前状态为监听状态");
    }

    @Override
    public void close() {

    }
}

class TCPClosed implements State{
    @Override
    public void open() {
        System.out.println("当前状态为关闭状态");
    }

    @Override
    public void close() {

    }
}

看完上面的代码,兄弟们是不是感觉状态设计模式就是一个解决选择语句的过程,因为不同的行为而产生不同的动作,这难道不就是我们常见的if|switch

代码语言:javascript
复制
if("established".equals(tcpConnection.state)){
            
}else if("listened".equals(tcpConnection.state)){
            
}else if("cloesed".equals(tcpConnection.state)){
            
}

我一手if|else不香嘛,搞那么麻烦干嘛,好啦,兄弟们该说出那句话了,「方便扩展,设计模式往往会将一个问题复杂化,进行结构的拆分,但随着业务的不断扩大,它的好处也会出现,方便维护和扩展。」

好啦,兄弟们。今天的设计模式就到这里了,兄弟们,晚安。明天也是美好的一天呢!!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 石的三次方 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档