国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

設(shè)計(jì)模式-狀態(tài)模式

williamwen1986 / 980人閱讀

摘要:定義狀態(tài)模式,當(dāng)一個(gè)對(duì)象的內(nèi)部狀態(tài)改變時(shí)允許改變其行為,這個(gè)對(duì)象看起來(lái)像是改變了其類??偨Y(jié)狀態(tài)模式和和策略模式有點(diǎn)相像,狀態(tài)模式的狀態(tài)轉(zhuǎn)移是內(nèi)部控制的,而策略模式是由客戶端控制采用不同的策略。

定義
狀態(tài)模式(State),當(dāng)一個(gè)對(duì)象的內(nèi)部狀態(tài)改變時(shí)允許改變其行為,這個(gè)對(duì)象看起來(lái)像是改變了其類。
類圖

Context:環(huán)境,上下文,其實(shí)就是狀態(tài)管理者,隱藏了狀態(tài)之間轉(zhuǎn)換的細(xì)節(jié),是客戶端與各個(gè)狀態(tài)的中間人。request()方法是客戶端調(diào)用的,

State:抽象狀態(tài),定義了狀態(tài)的處理抽象方法handle(),各個(gè)具體狀態(tài)需要實(shí)現(xiàn)它。

ConcreteState:具體狀態(tài),實(shí)現(xiàn)了狀態(tài)的公共方法,且包含了狀態(tài)轉(zhuǎn)換的判斷。

經(jīng)典源碼

狀態(tài)管理者

public class Context {
    //持有一個(gè)State類型的對(duì)象實(shí)例
    private State state;

    public void setState(State state) {
        this.state = state;
    }
    /**
     * 客戶端調(diào)用
     */
    public void request(String sampleParameter) {
        //轉(zhuǎn)調(diào)state來(lái)處理
        state.handle(sampleParameter);
    }
}

抽象狀態(tài)

public interface State {
    /**
     * 狀態(tài)對(duì)應(yīng)的處理
     */
    public void handle(String sampleParameter);
}

具體狀態(tài)A

public class ConcreteStateA implements State {

    @Override
    public void handle(String sampleParameter) {
        
        System.out.println("ConcreteStateA handle :" + sampleParameter);
    }

}

具體狀態(tài)B

public class ConcreteStateB implements State {

    @Override
    public void handle(String sampleParameter) {
        
        System.out.println("ConcreteStateB handle :" + sampleParameter);
    }

}
客戶端調(diào)用方
public class Client {

    public static void main(String[] args){
        //創(chuàng)建狀態(tài)
        State state = new ConcreteStateB();
        //創(chuàng)建環(huán)境
        Context context = new Context();
        //將狀態(tài)設(shè)置到環(huán)境中
        context.setState(state);
        //請(qǐng)求
        context.request("test");
    }
}
實(shí)際案例 背景

小A正在召喚師峽谷廝殺,他玩的是卡特,買了一本殺人書。隨著游戲時(shí)間的進(jìn)行,小A殺的人越來(lái)越多,且自己都沒(méi)死過(guò),游戲中不斷傳來(lái)“XXX暴走了”、“XXX主宰了比賽”、“XXX接近神了”。最終小A以12殺0死的完美戰(zhàn)績(jī)結(jié)束了比賽,腦海中剛才的捷報(bào)聲還在不停環(huán)繞在他的耳邊,他就想這不就是狀態(tài)模式,隨后打開(kāi)IDE開(kāi)始復(fù)現(xiàn)剛才的過(guò)程。

結(jié)構(gòu)

環(huán)境類

package com.jo.state;

/**
 * @author Jo
 * @date 2018/1/17
 */
public class LolContext {
    /**
     * 當(dāng)前殺人狀態(tài)
     */
    private KillState killState;

    /**
     * 當(dāng)前殺人數(shù)
     */
    private Integer killNum = 0;

    public LolContext() {
        killState = new Normal();
    }

    public Integer getKillNum() {
        return killNum;
    }

    public LolContext setKillState(KillState killState) {
        this.killState = killState;
        return this;
    }

    /**
     * 殺人方法,
     */
    public void kill(){
        killNum += 1;
        killState.kill(this);
        System.out.println("當(dāng)前擊殺數(shù)" + killNum);
        System.out.println();
    }
}

抽象殺人狀態(tài)

public interface KillState {
    /**
     * 抽象殺人方法
     * @param lolContext
     */
    void kill(LolContext lolContext);
}

普通擊殺

public class Normal implements KillState {
    @Override
    public void kill(LolContext lolContext) {
        System.out.println("你殺了一個(gè)人");
        //殺了2個(gè)人的時(shí)候轉(zhuǎn)換狀態(tài)
        if (lolContext.getKillNum() > 1){
            lolContext.setKillState(new KillingSpring());
        }
    }
}

大殺特殺

public class KillingSpring implements KillState {
    @Override
    public void kill(LolContext lolContext) {
        System.out.println("你正在大殺特殺");
        lolContext.setKillState(new Rampage());
    }
}

接近暴走

public class Rampage implements KillState {
    @Override
    public void kill(LolContext lolContext) {
        System.out.println("你已經(jīng)接近暴走了");
        lolContext.setKillState(new Unstoppable());
    }
}

無(wú)人可擋

public class Unstoppable implements KillState {
    @Override
    public void kill(LolContext lolContext) {
        System.out.println("你已經(jīng)無(wú)人可擋了");
        lolContext.setKillState(new Dominating());
    }
}

、
、


超神

public class Legendary implements KillState {
    @Override
    public void kill(LolContext lolContext) {
        System.out.println("你已經(jīng)超神了");
    }
}

客戶端調(diào)用

public class Client {
    public static void main(String[] args) {
        LolContext lolContext = new LolContext();
        for (int i = 0; i < 13; i++) {
            lolContext.kill();
        }
    }
}

運(yùn)行結(jié)果

客戶端只負(fù)責(zé)調(diào)用LolContext的kill方法,其余一概不知,內(nèi)部便會(huì)隨著殺人數(shù)的增長(zhǎng)打印不同的通知。而LolContext中也沒(méi)有復(fù)雜,一大串的if else switch case,狀態(tài)的轉(zhuǎn)移在各自的具體狀態(tài)中,如果需要修改部分邏輯只需要改對(duì)應(yīng)的狀態(tài),而不需要改原本在一起的if else,大大減少了隱患的發(fā)生率,從而不會(huì)發(fā)生牽一發(fā)而動(dòng)全身的結(jié)果。

適用場(chǎng)景

狀態(tài)模式的優(yōu)點(diǎn)是解除了程序的耦合度,采用子類的方式去除了煩瑣容易出錯(cuò)的if else,但反而帶來(lái)的是類的數(shù)據(jù)增多。如果你要實(shí)現(xiàn)的功能狀態(tài)不多,且功能簡(jiǎn)單,那不推薦使用狀態(tài)模式,不然會(huì)徒增程序的復(fù)雜性。且要執(zhí)行的動(dòng)作有一定的復(fù)雜度,此例的kill方法是最簡(jiǎn)單的實(shí)現(xiàn),實(shí)際應(yīng)用中復(fù)雜度是遠(yuǎn)遠(yuǎn)大于它的。你可以想象在狀態(tài)多,且復(fù)雜的動(dòng)作中不使用狀態(tài)模式會(huì)事怎樣,if else多的眼花繚亂,上一個(gè)if和下一個(gè)else if相差幾百行代碼,想必這樣的代碼誰(shuí)都不愿意碰,萬(wàn)一改壞了就要背鍋了。

總結(jié)

狀態(tài)模式和和策略模式有點(diǎn)相像,狀態(tài)模式的狀態(tài)轉(zhuǎn)移是內(nèi)部控制的,而策略模式是由客戶端控制采用不同的策略。因此在目的和實(shí)現(xiàn)還是有很大的差別的。有些場(chǎng)景“狀態(tài)”不是那么明顯,需要轉(zhuǎn)換成狀態(tài)模式就考察使用者的功底和對(duì)業(yè)務(wù)的理解程度了,望大家都能get更多知識(shí)點(diǎn),能力越來(lái)越強(qiáng),個(gè)個(gè)都是架構(gòu)師。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68263.html

相關(guān)文章

  • JS 狀態(tài)模式

    摘要:簡(jiǎn)介狀態(tài)模式允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變它的行為,對(duì)象看起來(lái)似乎修改了它的類。狀態(tài)通常為一個(gè)或多個(gè)枚舉常量的表示。簡(jiǎn)而言之,當(dāng)遇到很多同級(jí)或者的時(shí)候,可以使用狀態(tài)模式來(lái)進(jìn)行簡(jiǎn)化。 1. 簡(jiǎn)介 狀態(tài)模式(State)允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變它的行為,對(duì)象看起來(lái)似乎修改了它的類。其實(shí)就是用一個(gè)對(duì)象或者數(shù)組記錄一組狀態(tài),每個(gè)狀態(tài)對(duì)應(yīng)一個(gè)實(shí)現(xiàn),實(shí)現(xiàn)的時(shí)候根據(jù)狀態(tài)挨個(gè)去運(yùn)...

    xingqiba 評(píng)論0 收藏0
  • 狀態(tài)模式

    摘要:在狀態(tài)模式中,我們創(chuàng)建表示各種狀態(tài)的對(duì)象和一個(gè)行為隨著狀態(tài)對(duì)象改變而改變的對(duì)象。缺點(diǎn)狀態(tài)模式的使用必然會(huì)增加系統(tǒng)類和對(duì)象的個(gè)數(shù)。狀態(tài)模式是指允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為,對(duì)象看起來(lái)似乎修改了它的類。 狀態(tài)模式 在狀態(tài)模式(State Pattern)中,類的行為是基于它的狀態(tài)改變的。這種類型的設(shè)計(jì)模式屬于行為型模式。在狀態(tài)模式中,我們創(chuàng)建表示各種狀態(tài)的對(duì)象和一個(gè)行為隨著狀...

    Eric 評(píng)論0 收藏0
  • 一起學(xué)設(shè)計(jì)模式 - 備忘錄模式

    摘要:備忘錄模式常常與命令模式和迭代子模式一同使用。自述歷史所謂自述歷史模式實(shí)際上就是備忘錄模式的一個(gè)變種。在備忘錄模式中,發(fā)起人角色負(fù)責(zé)人角色和備忘錄角色都是獨(dú)立的角色。 備忘錄模式(Memento Pattern)屬于行為型模式的一種,在不破壞封裝特性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣就可以將該對(duì)象恢復(fù)到原先保存的狀態(tài)。 概述 備忘錄模式又叫做快照模式(...

    roland_reed 評(píng)論0 收藏0
  • 設(shè)計(jì)模式狀態(tài)模式

    摘要:為了實(shí)現(xiàn)這個(gè)正義偷笑又合理的訴求,你得先學(xué)會(huì)今天要介紹的設(shè)計(jì)模式,因?yàn)槟銈児镜倪@個(gè)流程可能就是用今天這個(gè)模式設(shè)計(jì)的。狀態(tài)模式對(duì)開(kāi)閉原則的支持并不太好,新增狀態(tài)時(shí),不僅得增加狀態(tài)類,還得修改原來(lái)已經(jīng)有的狀態(tài),讓之前的狀態(tài)切換到新增的狀態(tài)。一、定義你是否經(jīng)常請(qǐng)(偷)假(懶)?是不是對(duì)公司萬(wàn)惡的請(qǐng)假申請(qǐng)流程深惡痛絕。有沒(méi)有想過(guò)偷偷改造這個(gè)萬(wàn)惡的系統(tǒng),從 申請(qǐng)->項(xiàng)目經(jīng)理審批->部門審批->老板審...

    zhangke3016 評(píng)論0 收藏0
  • FSM狀態(tài)機(jī)之狀態(tài)模式

    摘要:要注意這里的一個(gè)狀態(tài)行為因?yàn)檫@個(gè)詞是狀態(tài)模式中最重要的個(gè)概念??紤]到這點(diǎn),聰明的在中推出了狀態(tài)機(jī)這個(gè)偽函數(shù),能夠幫助我們快速實(shí)現(xiàn)狀態(tài)化。這里就引入了狀態(tài)機(jī)這個(gè)概念,以及和他對(duì)應(yīng)的狀態(tài)表。 ?首先聲明一點(diǎn),這個(gè)模式是我目前見(jiàn)過(guò)最好用(本人觀點(diǎn)),但是也是最難理解的一個(gè)(本人觀點(diǎn))。 所以大家需要做好心理準(zhǔn)備,如果,對(duì)這個(gè)模式?jīng)]有特別強(qiáng)烈的需求,比如: 我有一個(gè)Button,我按次數(shù)點(diǎn)擊它...

    k00baa 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<