青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

積木

No sub title

  C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
  140 Posts :: 1 Stories :: 11 Comments :: 0 Trackbacks

常用鏈接

留言簿(1)

我參與的團(tuán)隊(duì)

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

轉(zhuǎn)載自:http://patmusing.blog.163.com/blog/static/13583496020101502024824/


也稱為
Objects for States模式。

允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變其行為,從而使對(duì)象看起來(lái)似乎修改了類(lèi)。

“Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.” – GoF

一個(gè)應(yīng)用的行為往往會(huì)根據(jù)其內(nèi)部變量值而表現(xiàn)出很大的不同。比如用Visual Studio開(kāi)發(fā)程序,當(dāng)寫(xiě)了一段程序后,如果點(diǎn)擊保存的按鈕,則所寫(xiě)的程序便保存到了硬盤(pán)上,然后保存按鈕變灰,這時(shí)候程序文件時(shí)saved的狀態(tài);在這個(gè)狀態(tài)上,如果有加了幾行代碼,那么狀態(tài)就變成unsaved,此時(shí),保存按鈕又可以點(diǎn)擊。savedunsaved是程序文件的狀態(tài),保存這個(gè)動(dòng)作是行為,對(duì)于saved或者unsaved,同樣的保存動(dòng)作有不同的意義,即,如果程序文件時(shí)saved的狀態(tài),那么點(diǎn)擊保存按鈕,則什么也不做(按鈕式灰色的);如果程序文件時(shí)unsaved狀態(tài),點(diǎn)擊保存按鈕,則保存程序文件。這個(gè)案例說(shuō)明,對(duì)象的狀態(tài)和其行為有密切的關(guān)系。

要解決類(lèi)似上面的問(wèn)題,通常的做法:

1. 設(shè)置一個(gè)狀態(tài)變量

2. switch – case或者if – else – if這樣的辦法來(lái)判定對(duì)象的狀態(tài),然后根據(jù)所得到的狀態(tài),選擇不同行為

如果增加了一個(gè)狀態(tài),那么

1. 增加一個(gè)狀態(tài)變量

2. 修改switch – case或者if – else – if語(yǔ)句,這顯然不符合OCP的原則(這里會(huì)增加編譯的時(shí)間成本),也沒(méi)有把程序變化部分和相對(duì)穩(wěn)定的部分隔離開(kāi),這會(huì)削弱應(yīng)用程序的可擴(kuò)展性

State模式就是為了解決上面的問(wèn)題而產(chǎn)生的。即專門(mén)處理當(dāng)對(duì)象處于不同的狀態(tài)時(shí),將會(huì)有不同的行為這樣的情況。

State模式的UML類(lèi)圖如下:

23. C++實(shí)現(xiàn)Behavioral - State模式 - 玄機(jī)逸士 - 玄機(jī)逸士博客

考慮一個(gè)門(mén)的狀態(tài):

23. C++實(shí)現(xiàn)Behavioral - State模式 - 玄機(jī)逸士 - 玄機(jī)逸士博客

說(shuō)明:

如果一個(gè)門(mén)處于Opened狀態(tài),那么對(duì)其施加close動(dòng)作,就會(huì)使門(mén)的狀態(tài)變成Closed的狀態(tài);

如果一個(gè)門(mén)處于Opened狀態(tài),那么對(duì)其施加open動(dòng)作,那么門(mén)的狀態(tài)不會(huì)改變,依舊是Opened的狀態(tài);

如果一個(gè)門(mén)處于Closed狀態(tài),那么對(duì)其施加open動(dòng)作,就會(huì)使門(mén)的狀態(tài)變成Opened的狀態(tài);

如果一個(gè)門(mén)處于Closed狀態(tài),那么對(duì)其施加close動(dòng)作,那么門(mén)的狀態(tài)不會(huì)改變,依舊是Closed的狀態(tài);

下面用State模式具體實(shí)現(xiàn)上面業(yè)務(wù)的C++代碼:

// State.h

#include <iostream>

#include <string>

#include <typeinfo>

#include <memory>

using namespace std;

// 前置聲明

class Door;

// 門(mén)的狀態(tài)

class DoorState

{

public:

virtual ~DoorState();

public:

virtual void open(Door* door) = 0; // 開(kāi)門(mén)

virtual void close(Door* door) = 0; // 關(guān)門(mén)

};

// 打開(kāi)狀態(tài)的門(mén)

class DoorOpened : public DoorState

{

public:

~DoorOpened();

public:

void open(Door* door);

void close(Door* door);

};

// 關(guān)閉狀態(tài)的門(mén)

class DoorClosed : public DoorState

{

public:

~DoorClosed();

public:

void open(Door* door);

void close(Door* door);

};

// 門(mén)

class Door

{

private:

auto_ptr<DoorState> door_state; // 門(mén)的狀態(tài)

public:

Door();

~Door();

public:

void open(); // 開(kāi)門(mén)

void close(); // 關(guān)門(mén)

void set_state(auto_ptr<DoorState> door_state); // 設(shè)置門(mén)的狀態(tài)

string get_state(); // 獲取門(mén)的狀態(tài)

};

// State.cpp

#include "State.h"

DoorState::~DoorState()

{

cout << "in the destructor of DoorState..." << endl;

}

DoorOpened::~DoorOpened()

{

cout << "in the destructor of DoorOpened..." << endl;

}

// 如果門(mén)已經(jīng)是打開(kāi)的狀態(tài),則僅輸出相關(guān)信息

void DoorOpened::open(Door* door)

{

cout << "The Door is already opened. State will not change..." << endl;

}

// 如果門(mén)是關(guān)閉的狀態(tài),則關(guān)門(mén)

void DoorOpened::close(Door* door)

{

auto_ptr<DoorState> ds(new DoorClosed());

door->set_state(ds);

}

DoorClosed::~DoorClosed()

{

cout << "in the destructor of DoorClosed..." << endl;

}

// 如果門(mén)是關(guān)閉的狀態(tài),則開(kāi)門(mén)

void DoorClosed::open(Door* door)

{

auto_ptr<DoorState> ds(new DoorOpened());

door->set_state(ds);

}

// 如果門(mén)已經(jīng)是關(guān)閉的狀態(tài),則僅輸出相關(guān)信息

void DoorClosed::close(Door* door)

{

cout << "The Door is already closed. State will not change..." << endl;

}

Door::Door()

{

auto_ptr<DoorState> ds(new DoorOpened()); // 設(shè)定門(mén)的初始狀態(tài)

door_state = ds;

}

Door::~Door()

{

cout << "in the destructor of Door..." << endl;

}

void Door::open() // 開(kāi)門(mén)

{

door_state->open(this);

}

void Door::close() // 關(guān)門(mén)

{

door_state->close(this);

}

void Door::set_state(auto_ptr<DoorState> door_state) // 設(shè)定門(mén)的狀態(tài)

{

this->door_state = door_state;

}

// 利用RTTI技術(shù),輸出門(mén)的狀態(tài)

string Door::get_state()

{ // *(door_state.get())*(door_state)的寫(xiě)法是等價(jià)的,get()表示獲取auto_ptr對(duì)象中underlying對(duì)象的真實(shí)指針,因此語(yǔ)

// 法上顯得更好理解一些。但*auto_ptr中也被重載過(guò)了,因此兩者的結(jié)果是一樣的。

string temp = typeid(*(door_state.get())).name(); // temp將等于 "class DoorOpened""class DoorClosed"

size_t found = temp.find("Door"); // 找到"Door"temp中位置

temp = temp.substr(found + 4); // 去掉"Door"(包括其自身)前面的字符串

return temp;

}

// PatternClient.cpp

#include "State.h"

int main(int argc, char** argv)

{

Door door;

cout << "1. Initial state of the door: " << door.get_state() << endl;

cout << "------------------------------------------------------" << endl;

cout << endl;

door.open();

cout << "2. State after opening the door: " << door.get_state() << endl;

cout << "------------------------------------------------------" << endl;

cout << endl;

door.close();

cout << "3. State after closing the door: " << door.get_state() << endl;

cout << "------------------------------------------------------" << endl;

cout << endl;

door.close();

cout << "4. State after closing the door: " << door.get_state() << endl;

cout << "------------------------------------------------------" << endl;

cout << endl;

door.open();

cout << "5. State after opening the door: " << door.get_state() << endl;

cout << "------------------------------------------------------" << endl;

cout << endl;

return 0;

}

輸出結(jié)果:

1. Initial state of the door: Opened

------------------------------------------------------

The Door is already opened. State will not change...

2. State after opening the door: Opened

------------------------------------------------------

in the destructor of DoorOpened...

in the destructor of DoorState...

3. State after closing the door: Closed

------------------------------------------------------

The Door is already closed. State will not change...

4. State after closing the door: Closed

------------------------------------------------------

in the destructor of DoorClosed...

in the destructor of DoorState...

5. State after opening the door: Opened

------------------------------------------------------

in the destructor of Door...

in the destructor of DoorOpened...

in the destructor of DoorState...

上面程序的UML類(lèi)圖如下:

23. C++實(shí)現(xiàn)Behavioral - State模式 - 玄機(jī)逸士 - 玄機(jī)逸士博客

要點(diǎn):

- State設(shè)計(jì)模式將一個(gè)特定狀態(tài)相關(guān)的行為都放入一個(gè)State的子類(lèi)對(duì)象中,在對(duì)象狀態(tài)切換時(shí),切換相應(yīng)的對(duì)象;但同時(shí)維持State的接口穩(wěn)定,這樣實(shí)現(xiàn)了具體操作與狀態(tài)轉(zhuǎn)換之間的解耦。

- 為不同的狀態(tài)引入不同的對(duì)象,使得一個(gè)狀態(tài)和一個(gè)對(duì)象一一對(duì)應(yīng),這也是為什么這個(gè)模式也稱為Objects for States的原因。這使得狀態(tài)轉(zhuǎn)換變得更加明確,而且可以保證不會(huì)出現(xiàn)狀態(tài)不一致的情況,因?yàn)閷?duì)象的狀態(tài)是由一個(gè)類(lèi)來(lái)表示的,那么就保證了狀態(tài)轉(zhuǎn)換的原子性 即要么轉(zhuǎn)換成功,要不轉(zhuǎn)換 (即上面示例程序中的door_state要么被設(shè)定為DoorOpened,要么被設(shè)定為DoorClosed。如果一個(gè)對(duì)象有很多狀態(tài),采用通常的方法會(huì)有很復(fù)雜的if-else if-else語(yǔ)句,維護(hù)這些復(fù)雜的語(yǔ)句,很有可能導(dǎo)致各種麻煩,其中之一就是狀態(tài)的不一致。)

- State模式和Strategy模式很類(lèi)似。它們最主要的區(qū)別就是:State模式是用不同的對(duì)象去封裝不同的狀態(tài),而Stategy模式用不同的對(duì)象去封裝不同的算法。

參考:

1. auto_ptr的用途和原理,詳見(jiàn):http://patmusing.blog.163.com/blog/static/13583496020101824142699/

2. 使用auto_ptr的注意事項(xiàng),詳見(jiàn):http://patmusing.blog.163.com/blog/static/13583496020101824541270/

3. 關(guān)于RTTI,詳見(jiàn)Stan Lippman的《C++ Primer》第4版之第18



posted on 2013-03-08 15:24 Jacc.Kim 閱讀(287) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 設(shè)計(jì)模式
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            好吊色欧美一区二区三区视频| 亚洲精品综合精品自拍| 精品二区久久| 国产欧美 在线欧美| 欧美午夜三级| 国产精品一区二区在线观看网站| 国产精品成人在线观看| 国产精品porn| 国产一区欧美| 亚洲人在线视频| 制服丝袜激情欧洲亚洲| 亚洲免费影院| 久久亚洲精品伦理| 亚洲国产欧美日韩| 欧美国产视频在线| 日韩亚洲一区在线播放| 欧美一区二区三区在线播放| 久久狠狠亚洲综合| 欧美韩日一区二区| 国产精品免费视频xxxx| 国语自产精品视频在线看抢先版结局| 亚洲国产精品成人精品| 亚洲制服av| 美女视频网站黄色亚洲| 日韩视频精品| 久久久久久成人| 国产精品av免费在线观看| 精品福利电影| 亚洲欧洲99久久| 亚洲国产婷婷香蕉久久久久久99| 亚洲免费视频中文字幕| 欧美国产视频在线观看| 国产精品免费一区二区三区观看| 永久久久久久| 欧美在线不卡| 一本色道久久88综合亚洲精品ⅰ| 久久久国产亚洲精品| 欧美日韩午夜| 亚洲国产欧美在线人成| 亚洲欧美一区二区视频| 亚洲高清久久| 久久精品视频在线播放| 国产精品久久久久久亚洲调教| 亚洲国产99精品国自产| 欧美影院久久久| 久久久一区二区| 精品999日本| 亚洲视频在线看| 欧美激情一二区| 久久成人一区二区| 国产精品日本| 一区电影在线观看| 欧美黑人国产人伦爽爽爽| 91久久夜色精品国产九色| 欧美一区永久视频免费观看| 亚洲巨乳在线| 欧美精品18videos性欧美| 在线播放一区| 久久久人成影片一区二区三区 | 中文一区在线| 亚洲激情电影在线| 欧美高清免费| av成人手机在线| 亚洲日本激情| 欧美日本不卡视频| 99精品国产在热久久下载| 91久久国产综合久久蜜月精品 | 激情视频一区二区三区| 久久精品国产亚洲一区二区三区| 亚洲视频自拍偷拍| 国产精品久久7| 午夜精品久久久久久久99黑人| 一区二区三区福利| 国产日韩精品久久| 久久天天躁狠狠躁夜夜爽蜜月| 欧美在线视频观看| 在线欧美日韩| 亚洲精品日日夜夜| 欧美视频一区在线| 久久精品网址| 免费在线欧美黄色| 亚洲午夜成aⅴ人片| 午夜免费在线观看精品视频| 黑人巨大精品欧美一区二区| 欧美韩国在线| 国产精品美女久久久久av超清| 久久久国产一区二区三区| 久久婷婷丁香| 亚洲视频在线视频| 亚洲欧美三级在线| 一区二区在线看| 亚洲毛片在线观看.| 国产精品午夜在线| 狂野欧美性猛交xxxx巴西| 欧美精品首页| 久久国产毛片| 欧美日韩1区| 久久久精品久久久久| 男同欧美伦乱| 午夜一区不卡| 欧美高清你懂得| 久久久亚洲影院你懂的| 欧美精品一区三区| 久久久夜精品| 在线性视频日韩欧美| 亚洲女爱视频在线| 亚洲人成人77777线观看| 亚洲男人第一av网站| 亚洲美女av网站| 久久se精品一区精品二区| 99国产精品| 久久天堂成人| 久久久亚洲高清| 国产精品日日摸夜夜摸av| 亚洲国产精品va在看黑人| 国模吧视频一区| 亚洲欧美另类国产| 亚洲一二区在线| 欧美精品性视频| 免费在线观看成人av| 国产精品久久久久国产精品日日| 亚洲在线视频网站| 国产欧美在线观看| 亚洲全部视频| 在线成人激情黄色| 欧美一级播放| 欧美在线3区| 国产欧美日韩一区二区三区在线| 夜夜嗨av一区二区三区网站四季av| 亚洲国产精品一区二区www在线 | 亚洲欧美视频| 欧美日韩一级黄| 日韩视频第一页| 亚洲午夜在线| 国产精品扒开腿爽爽爽视频| 亚洲精品国产拍免费91在线| 亚洲精品国精品久久99热| 免费观看欧美在线视频的网站| 老司机免费视频久久| 狠狠综合久久av一区二区老牛| 香蕉久久一区二区不卡无毒影院 | 亚洲片区在线| 亚洲免费黄色| 欧美日韩精品综合| 一本色道久久综合狠狠躁篇怎么玩| 日韩视频不卡中文| 欧美日韩国产成人在线观看| 91久久精品美女高潮| 夜夜爽www精品| 欧美特黄a级高清免费大片a级| 亚洲视频香蕉人妖| 欧美在线免费一级片| 国产一区二三区| 欧美sm视频| 99精品国产在热久久下载| 午夜精品视频在线观看一区二区| 国产精品一区亚洲| 久久久久久久国产| 亚洲黄一区二区三区| 亚洲色图在线视频| 国产美女精品在线| 久久精品国产99精品国产亚洲性色| 另类天堂av| 美女视频黄 久久| 99国产精品| 亚洲大片在线| 久久亚洲综合色一区二区三区| 国产精品一区二区视频| 香蕉久久夜色| 欧美本精品男人aⅴ天堂| 亚洲日本一区二区三区| 欧美日韩亚洲一区| 亚洲欧美日韩国产成人| 久久综合一区| 99视频在线精品国自产拍免费观看| 欧美日韩一区精品| 亚洲欧美在线看| 免费在线亚洲欧美| 亚洲女与黑人做爰| 黄色影院成人| 欧美日韩视频在线| 久久国产一区| 日韩一区二区精品| 久久久一二三| 一区二区三区久久久| 国产真实久久| 欧美日韩在线不卡| 久久久欧美精品| 亚洲一区二区三区涩| 亚洲盗摄视频| 久久激情久久| 亚洲先锋成人| 亚洲激情一区二区| 国产亚洲人成a一在线v站| 欧美揉bbbbb揉bbbbb| 久热精品在线| 久久爱www久久做| 一区二区三区精品视频| 欧美jizzhd精品欧美巨大免费| 亚洲欧美视频一区二区三区|