狀態(tài)模式

《大話設(shè)計(jì)模式》閱讀筆記和總結(jié)诞挨。原書(shū)是C#編寫(xiě)的扫沼,本人用Java實(shí)現(xiàn)了一遍,包括每種設(shè)計(jì)模式的UML圖實(shí)現(xiàn)和示例代碼實(shí)現(xiàn)浴韭。
目錄:設(shè)計(jì)模式
Github地址:DesignPattern

說(shuō)明

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

UML圖:

狀態(tài)模式UML圖.png

代碼實(shí)現(xiàn):

State類(lèi)兼搏,抽象狀態(tài)類(lèi)卵慰,定義一個(gè)接口以封裝與Context的一個(gè)特定狀態(tài)相關(guān)的行為。

abstract class State{
    public abstract void Handle(Context context);
}

ConcreteState類(lèi)向族,具體狀態(tài)呵燕。每一個(gè)子類(lèi)實(shí)現(xiàn)一個(gè)與Context的一個(gè)狀態(tài)相關(guān)的行為。

class ConcreteStateA extends State {

    @Override
    public void Handle(Context context) {
        context.setState(new ConcreteStateB());
    }
}

class ConcreteStateB extends State {

    @Override
    public void Handle(Context context) {
        context.setState(new ConcreteStateA());
    }
}

Context類(lèi)件相,維護(hù)一個(gè)ConcreteState子類(lèi)的實(shí)例,這個(gè)實(shí)例定義當(dāng)前的狀態(tài)氧苍。

class Context{
    private State state;
    // 定義Context的初始狀態(tài)
    public Context(State state){
        this.state = state;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
        System.out.println("當(dāng)前狀態(tài):"+state);
    }

    // 對(duì)請(qǐng)求做處理夜矗,并設(shè)置下一狀態(tài)
    public void Request(){
        state.Handle(this);
    }
}

客戶(hù)端代碼

public class StatePattern {
    public static void main(String[] args){
        Context context = new Context(new ConcreteStateA());
        context.Request();
        context.Request();
        context.Request();
        context.Request();
    }
}

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

當(dāng)前狀態(tài):com.shijc.dp.state.ConcreteStateB@4554617c
當(dāng)前狀態(tài):com.shijc.dp.state.ConcreteStateA@74a14482
當(dāng)前狀態(tài):com.shijc.dp.state.ConcreteStateB@1540e19d
當(dāng)前狀態(tài):com.shijc.dp.state.ConcreteStateA@677327b6

示例

例子:程序員的一天往往是比較固定的,上午的時(shí)候精神百倍让虐,中午餓了犯困紊撕,需要午休;下午精神還不錯(cuò)赡突,如果能準(zhǔn)時(shí)下班必是極好的对扶;但是如果加班到晚上,傍晚比較疲憊惭缰,如果加班到很晚浪南,那就困極了睡著了。用程序模擬這個(gè)過(guò)程漱受。

UML圖:

狀態(tài)模式示例UML圖.png

代碼實(shí)現(xiàn):

抽象狀態(tài)類(lèi)络凿,定義一個(gè)抽象方法"寫(xiě)程序"

public abstract class WorkState {
    public abstract void WriteProgram(Work w);
}

上午工作狀態(tài)

public class ForenoonState extends WorkState {
    @Override
    public void WriteProgram(Work w) {
        if (w.getHour()<12){
            System.out.println("當(dāng)前時(shí)間:"+ w.getHour()+"點(diǎn) 上午工作,精神百倍");
        }else {
            w.setState(new NoonState());
            w.WriteProgram();
        }

    }
}

中午工作狀態(tài)

public class NoonState extends WorkState {
    @Override
    public void WriteProgram(Work w) {
        if (w.getHour()<13){
            System.out.println("當(dāng)前時(shí)間:"+ w.getHour()+"點(diǎn) 餓了昂羡,犯困絮记,午休");
        }else {
            w.setState(new AfternoonState());
            w.WriteProgram();
        }

    }
}

下午工作狀態(tài)

public class AfternoonState extends WorkState {
    @Override
    public void WriteProgram(Work w) {
        if (w.getHour()<17){
            System.out.println("當(dāng)前時(shí)間:"+ w.getHour()+"點(diǎn) 下午狀態(tài)還不錯(cuò),繼續(xù)努力");
        }else {
            w.setState(new EveningState());
            w.WriteProgram();
        }

    }
}

晚上工作狀態(tài)

public class EveningState extends WorkState {
    @Override
    public void WriteProgram(Work w) {
        if (w.isFinish()){
            w.setState(new RestState());
            w.WriteProgram();
        }else {
            if (w.getHour()<21){
                System.out.println("當(dāng)前時(shí)間:"+ w.getHour()+"點(diǎn) 加班哦虐先,疲累至極");
            }else {
                w.setState(new SleepingState());
                w.WriteProgram();
            }
        }


    }
}

睡眠工作狀態(tài)

public class SleepingState extends WorkState {
    @Override
    public void WriteProgram(Work w) {
        System.out.println("當(dāng)前時(shí)間:"+ w.getHour()+"點(diǎn) 不行了怨愤,睡著了");

    }
}

下班狀態(tài)

public class RestState extends WorkState {
    @Override
    public void WriteProgram(Work w) {
        System.out.println("當(dāng)前時(shí)間:"+ w.getHour()+"點(diǎn) 下班回家了");

    }
}

工作類(lèi)

public class Work {
    private WorkState current;
    public Work(){
        //工作初始化為上午工作狀態(tài),即上午9點(diǎn)開(kāi)始上班
        current = new ForenoonState();
    }
    // 鐘點(diǎn)屬性蛹批,狀態(tài)轉(zhuǎn)換的依據(jù)
    private double hour;
    // 任務(wù)完成屬性
    private boolean finish;

    public double getHour() {
        return hour;
    }

    public void setHour(double hour) {
        this.hour = hour;
    }

    public boolean isFinish() {
        return finish;
    }

    public void setFinish(boolean finish) {
        this.finish = finish;
    }

    public void setState(WorkState state){
        current = state;
    }

    public void WriteProgram(){
        current.WriteProgram(this);
    }
}

客戶(hù)端代碼

public class Main {
    public static void main(String[] args){
        Work emergencyProjects = new Work();
        emergencyProjects.setHour(9);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(10);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(12);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(13);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(14);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(17);

        emergencyProjects.setFinish(false);

        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(19);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(22);
        emergencyProjects.WriteProgram();
    }
}

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

當(dāng)前時(shí)間:9.0點(diǎn) 上午工作撰洗,精神百倍
當(dāng)前時(shí)間:10.0點(diǎn) 上午工作膀息,精神百倍
當(dāng)前時(shí)間:12.0點(diǎn) 餓了,犯困了赵,午休
當(dāng)前時(shí)間:13.0點(diǎn) 下午狀態(tài)還不錯(cuò)潜支,繼續(xù)努力
當(dāng)前時(shí)間:14.0點(diǎn) 下午狀態(tài)還不錯(cuò),繼續(xù)努力
當(dāng)前時(shí)間:17.0點(diǎn) 加班哦柿汛,疲累至極
當(dāng)前時(shí)間:19.0點(diǎn) 加班哦冗酿,疲累至極
當(dāng)前時(shí)間:22.0點(diǎn) 不行了,睡著了
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末络断,一起剝皮案震驚了整個(gè)濱河市裁替,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌貌笨,老刑警劉巖弱判,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異锥惋,居然都是意外死亡昌腰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)膀跌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)遭商,“玉大人,你說(shuō)我怎么就攤上這事捅伤〗倭鳎” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵丛忆,是天一觀的道長(zhǎng)祠汇。 經(jīng)常有香客問(wèn)我,道長(zhǎng)熄诡,這世上最難降的妖魔是什么可很? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮粮彤,結(jié)果婚禮上根穷,老公的妹妹穿的比我還像新娘。我一直安慰自己导坟,他們只是感情好屿良,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著惫周,像睡著了一般尘惧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上递递,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天喷橙,我揣著相機(jī)與錄音啥么,去河邊找鬼。 笑死贰逾,一個(gè)胖子當(dāng)著我的面吹牛悬荣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播疙剑,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼氯迂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了言缤?” 一聲冷哼從身側(cè)響起嚼蚀,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎管挟,沒(méi)想到半個(gè)月后轿曙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡僻孝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年导帝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皮璧。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舟扎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悴务,到底是詐尸還是另有隱情,我是刑警寧澤譬猫,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布讯檐,位于F島的核電站,受9級(jí)特大地震影響染服,放射性物質(zhì)發(fā)生泄漏别洪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一柳刮、第九天 我趴在偏房一處隱蔽的房頂上張望挖垛。 院中可真熱鬧,春花似錦秉颗、人聲如沸痢毒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哪替。三九已至,卻和暖如春菇怀,著一層夾襖步出監(jiān)牢的瞬間凭舶,已是汗流浹背晌块。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留帅霜,地道東北人匆背。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像身冀,于是被迫代替她去往敵國(guó)和親钝尸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 【學(xué)習(xí)難度:★★★☆☆闽铐,使用頻率:★★★☆☆】直接出處:狀態(tài)模式梳理和學(xué)習(xí):https://github.com/...
    BruceOuyang閱讀 1,158評(píng)論 0 2
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是狀態(tài)模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 狀態(tài)模式和策略模式的區(qū)別 優(yōu)點(diǎn)和缺點(diǎn)...
    w1992wishes閱讀 749評(píng)論 0 6
  • .概述 在軟件開(kāi)發(fā)過(guò)程中蝶怔,應(yīng)用程序可能會(huì)根據(jù)不同的情況作出不同的處理。最直接的解決方案是將這些所有可能發(fā)生的情況全...
    泥孩兒0107閱讀 370評(píng)論 0 0
  • 1 場(chǎng)景問(wèn)題# 1.1 實(shí)現(xiàn)在線投票## 考慮一個(gè)在線投票的應(yīng)用兄墅,要實(shí)現(xiàn)控制同一個(gè)用戶(hù)只能投一票踢星,如果一個(gè)用戶(hù)反復(fù)...
    七寸知架構(gòu)閱讀 1,937評(píng)論 7 53
  • 文/博土 清晨開(kāi)始 別人的文字 從遠(yuǎn)方飄入,我的眼簾 就通過(guò)黑色瞳孔 這個(gè)比地獄還要深程度的黑色大門(mén) 進(jìn)入了蹩腳詩(shī)...
    博土閱讀 393評(píng)論 0 4