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

狀態(tài)模式

GOF對(duì)于狀態(tài)模式的定義是:“當(dāng)一個(gè)對(duì)象的內(nèi)在狀態(tài)改變時(shí)允許改變其行為,這個(gè)對(duì)象看起來(lái)像是改變了其類导匣≮迤”

狀態(tài)模式的好處就是將與特定狀態(tài)相關(guān)的行為進(jìn)行局部化,并且將不同狀態(tài)的行為進(jìn)行分割涕俗。也就是將特定的與該狀態(tài)相關(guān)的行為都放進(jìn)一個(gè)對(duì)象之中,由于所有與狀態(tài)有關(guān)的代碼都存在于某個(gè)具體的狀態(tài)類中神帅,所以通過(guò)定義新的具體狀態(tài)類就可以很容易地添加新的狀態(tài)和轉(zhuǎn)換咽袜。

下面以列車的狀態(tài)為例,上代碼

package State;

public class Train {
    private State currentState;
    public Train()
    {
        currentState = new StartState();
    }
    private int speed;
    private boolean giveWay = false;
    public void setState(State state)
    {
        currentState = state;
    }
    public int getSpeed() {
        return speed;
    }
    public void setSpeed(int speed) {
        this.speed = speed;
    }
    public boolean isGiveWay() {
        return giveWay;
    }
    public void setGiveWay(boolean giveWay) {
        this.giveWay = giveWay;
    }
    public void Run()
    {
        currentState.Run(this);
    }
}
package State;

public abstract class State  {
    public abstract void Run(Train train);
}
package State;

public class StartState extends State{

    @Override
    public void Run(Train train) {
        // TODO Auto-generated method stub
        if(train.getSpeed() == 0)
        {
            System.out.println("當(dāng)前時(shí)速為:" + train.getSpeed()
            + "列車開始啟動(dòng)");
        }
        else
        {
            train.setState(new FastState());
            train.Run();
        }
    }
}
package State;

public class FastState extends State{

    @Override
    public void Run(Train train) {
        // TODO Auto-generated method stub
        if(train.getSpeed() < 200)
        {
            System.out.println("當(dāng)前時(shí)速為:" + train.getSpeed()
            + "列車正在加速");
        }
        else
        {
            train.setState(new SlowState());
            train.Run();
        }
    }
}
package State;

public class SlowState extends State{
    @Override
    public void Run(Train train) {
        // TODO Auto-generated method stub
        if(train.getSpeed() > 200)
        {
            System.out.println("當(dāng)前時(shí)速為:" + train.getSpeed()
            + "列車正在減速");
        }
        else
        {
            train.setState(new RunState());
            train.Run();
        }
    }
}
package State;

public class RunState extends State{

    @Override
    public void Run(Train train) {
        // TODO Auto-generated method stub
        if(train.isGiveWay())
        {
            train.setState(new StopState());
            train.Run();
        }
        else
        {
            System.out.println("當(dāng)前時(shí)速為:" + train.getSpeed()
            + "列車正在勻速行駛");
        }
    }
}
package State;

public class StopState extends State{

    @Override
    public void Run(Train train) {
        // TODO Auto-generated method stub
        System.out.println("當(dāng)前時(shí)速為:" + train.getSpeed()
        + "列車正在停止枕稀,準(zhǔn)備讓行");
    }
}
package State;

public class client {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Train train = new Train();
        train.setSpeed(0);
        train.Run();
        
        train.setSpeed(100);
        train.Run();
        train.setSpeed(150);
        train.Run();
        train.setSpeed(210);
        train.Run();
        train.setSpeed(200);
        train.Run();
        
        train.setGiveWay(true);;
        train.Run();
    }
}

一個(gè)對(duì)象的狀態(tài)指的就是這個(gè)對(duì)象的屬性值的組合,如果我們改變了這些屬性的任意一個(gè)谜嫉,這個(gè)對(duì)象的狀態(tài)就發(fā)生了改變萎坷。
狀態(tài)模式適用于以下情況:

  1. 一個(gè)對(duì)象的行為取決于它的狀態(tài),并且他必須在運(yùn)行時(shí)刻根據(jù)狀態(tài)來(lái)改變自己的行為
  2. 當(dāng)一個(gè)操作含有大量的多分支條件語(yǔ)句沐兰,并且這些分支都依賴于對(duì)象的狀態(tài)時(shí)哆档。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市住闯,隨后出現(xiàn)的幾起案子瓜浸,更是在濱河造成了極大的恐慌,老刑警劉巖比原,帶你破解...
    沈念sama閱讀 221,331評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件插佛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡量窘,警方通過(guò)查閱死者的電腦和手機(jī)雇寇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人锨侯,你說(shuō)我怎么就攤上這事嫩海。” “怎么了囚痴?”我有些...
    開封第一講書人閱讀 167,755評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵叁怪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我深滚,道長(zhǎng)奕谭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,528評(píng)論 1 296
  • 正文 為了忘掉前任成箫,我火速辦了婚禮展箱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蹬昌。我一直安慰自己混驰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評(píng)論 6 397
  • 文/花漫 我一把揭開白布皂贩。 她就那樣靜靜地躺著栖榨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪明刷。 梳的紋絲不亂的頭發(fā)上婴栽,一...
    開封第一講書人閱讀 52,166評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音辈末,去河邊找鬼愚争。 笑死,一個(gè)胖子當(dāng)著我的面吹牛挤聘,可吹牛的內(nèi)容都是我干的轰枝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,768評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼组去,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鞍陨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起从隆,我...
    開封第一講書人閱讀 39,664評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诚撵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后键闺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寿烟,經(jīng)...
    沈念sama閱讀 46,205評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評(píng)論 3 340
  • 正文 我和宋清朗相戀三年辛燥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了韧衣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盅藻。...
    茶點(diǎn)故事閱讀 40,435評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖畅铭,靈堂內(nèi)的尸體忽然破棺而出氏淑,到底是詐尸還是另有隱情,我是刑警寧澤硕噩,帶...
    沈念sama閱讀 36,126評(píng)論 5 349
  • 正文 年R本政府宣布假残,位于F島的核電站,受9級(jí)特大地震影響炉擅,放射性物質(zhì)發(fā)生泄漏辉懒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評(píng)論 3 333
  • 文/蒙蒙 一谍失、第九天 我趴在偏房一處隱蔽的房頂上張望眶俩。 院中可真熱鬧,春花似錦快鱼、人聲如沸颠印。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)线罕。三九已至,卻和暖如春窃判,著一層夾襖步出監(jiān)牢的瞬間钞楼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工袄琳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留询件,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,818評(píng)論 3 376
  • 正文 我出身青樓唆樊,卻偏偏與公主長(zhǎng)得像宛琅,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子窗轩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評(píng)論 2 359

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

  • 設(shè)計(jì)模式基本原則 開放-封閉原則(OCP),是說(shuō)軟件實(shí)體(類座咆、模塊痢艺、函數(shù)等等)應(yīng)該可以拓展,但是不可修改介陶。開-閉原...
    西山薄涼閱讀 3,806評(píng)論 3 14
  • 我可以做什么堤舒;我想成為什么;我需要如何開始自己的事業(yè)我的專業(yè)與我以后的工作相關(guān)度是否高哺呜?我的興趣或我的理想是什么舌缤?...
    為了明日_will閱讀 155評(píng)論 0 0
  • 頭頂那點(diǎn)點(diǎn)繁星,宛如原野般遼闊 那么近,那么近 就好像我和你的關(guān)系 連風(fēng)都吹不過(guò)去 腳下那片草原国撵,好像星海般浩渺 ...
    吹笛者的鐐銬閱讀 189評(píng)論 0 0
  • 出處:歷代詩(shī)詞名句辭典陵吸!一一唐,劉禹錫介牙,《憶江南》 [析賞]東風(fēng)輕吹壮虫,弱柳搖曳,春天又過(guò)去了环础,多么感謝懷念那洛城的...
    快樂(lè)天成閱讀 342評(píng)論 1 2
  • 最近囚似,在給項(xiàng)目組使用Spring搭建Java項(xiàng)目基礎(chǔ)框架時(shí),發(fā)現(xiàn)使用Spring提供的BeanPostProces...
    圓圓仙人球閱讀 47,273評(píng)論 37 98