IT铁人DAY 17-State 状态模式

  今天介绍的State Pattern与昨天的Strategy Pattern非常的相似,不过它们之间到底有没有甚麽差别呢?现在就带你一起来了解!


问题情境与解析

  通常程序如果碰到「因状态不同而需要有不同的逻辑行为或是处理步骤」,第一个直觉就会想到if-else 或是 switch-case,不过开始添加物件新的状态与其行为时,很可能此类别的方法就会有可怕的条件式,像这样的程序很难去维护,因为对於逻辑转换的修改都可能需要更改每一个方法中的状态条件,随着程序的发展,问题往往只会越来越大,所有状态的条件式也可能变得臃肿不堪。

  碰到这种问题,透过状态模式,我们会将物件所有的状态拉出来创一个新的类别,并包含该状态所有的行为,而物件本身只需要有状态的属性来储存其状态,好让它可以呼叫该状态的行为模式。

  再举个例子来说,就像手机可以简单分成一般模式、震动模式及勿扰模式(不同的状态类别),在一般模式下,有通知会正常响铃并显示资讯在萤幕上;震动模式的话不会响铃但是会让手机震动;勿扰模式就不会有任何动作了。以上示例了一件事情在三个状态下做了不一样的行为,相信大家对於状态模式又更加熟悉了!

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20210930/20140743ErMfDVNY4o.png

Skeleton Code

class Context {
    private State state;
    
    public Context(State initialState) {
        // initial state
        this.state = initialState;
        state.setContext(this);
    }

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

    public Type request() {
        state.handle();
    }
}

interface State {
    public Type handle();
}

class ConcreteState1 implements State {	
    private Context context;

    public void setContext(Context context) {	   
        this.context = context;
    }  

    public Type handle() {	   
        // A state may issue state transition in context
        context.setState(new ConcreteState2);

        // other operation
    }
}

class ConcreteState2 implements State {	        
    private Context context;

    public void setContext(Context context) {	   
        this.context = context;
    }  

    public Type handle() {	   
        // other operation
    }
}

  看到这边,是不是觉得与上一篇的Strategy Pattern整体的结构非常相似,但它们有个关键的区分方式,就是在状态模式中,特定的状态可能会与其他状态有所关联,来达到物件的状态转换;反之,策略之间几乎不了解彼此,并且独立的存在。


除此之外,也欢迎大家走走逛逛关於我们团队夥伴的文章

lu23770127 - SASS 基础初学三十天

10u1 - 糟了!是世界奇观!

juck30808 - Python - 数位行销分析与 Youtube API 教学

SiQing47 - 前端?後端?你早晚都要全端的,何不从现在开始?


<<:  G-coin scam?

>>:  [DAY24]Istio-Gateway

[Day20] - Vue 的 Html 字串处理 ( Html String to Ast Object )

day-13 介绍 , 当资料改变时 , 我们可以利用 _render 来更新 dom 可是如果每次...

day23 : TIDB on K8S (下)

尝试使用了TIDB後,接着就开始让他跟k8s做结合吧,我会介绍一次完整的TIoperator,然後配...

Day 8 矛盾又挣扎揭弊者

我们仰望着同一片天空,却看着不同的地方,即使同一片花瓣,我们也会因为不同季节,而有不同的感受,也许对...

Swift纯Code之旅 Day19. 「ViewController好乱(1) - MVC介绍)」

前言 做到现在会发现每个ViewController内的程序码都一大堆,有画面元件,有逻辑,有Mod...

[CSS] Flex/Grid Layout Modules, part 11

现在终於可以开始讲 Grid 单元的事情了,虽然可以讲的事情可能不多,绝大部分会围绕在造成容器影响的...