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

2021-01-05 22:29:20 浏览数 (1)

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

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

我们在日常学习中这种状况很常见,比如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不香嘛,搞那么麻烦干嘛,好啦,兄弟们该说出那句话了,「方便扩展,设计模式往往会将一个问题复杂化,进行结构的拆分,但随着业务的不断扩大,它的好处也会出现,方便维护和扩展。」

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

0 人点赞