狀態模式也是實際開發中應用非常廣泛的一種設計模式,該模式可以有效地減小**中switch和if的分支量,使**更簡潔,更容易擴充套件。
接下來我們舉乙個電梯控制系統的例子,電梯有4個功能,分別是關門、開門、執行、停止,同時也有4種狀態,分別是關門狀態、開門狀態,執行狀態、停止狀態。
下面是使用狀態模式前的實現方案
enum liftstatus
;class
lift
}void
close()
}void
run()}
void
stop()
}private
: liftstatus status;
};
從上述**可以看出,主控制類lift裡面有一大串的switch語句,邏輯全都在lift裡面了,**耦合度非常高,也不利於後續擴充套件狀態。
接下來再看下使用狀態模式來實現的**
我們將每個狀態都單獨定義成類,狀態的切換邏輯都有各個狀態類去實現
// 電梯狀態抽象類
class
liftstatus
virtual
void
open()
=0;// 開門
virtual
void
close()
=0;// 關門
virtual
void
run()=
0;// 執行
virtual
void
stop()
=0;// 停止
protected
: lift* lift_;};
// 開門狀態
class
openstatus
:public liftstatus
void
open()
void
close()
void
run(
)void
stop()
};// 關門狀態
class
closestatus
:public liftstatus
void
open()
void
close()
void
run(
)void
stop()
};// 執行狀態
class
runstatus
:public liftstatus
void
open()
void
close()
void
run(
)void
stop()
};// 停止狀態
class
stopstatus
:public liftstatus
void
open()
void
close()
void
run(
)void
stop()
};
下面就是狀態模式下的電梯主控制類lift
class
lift
; currentstatus = liftstatusgroup[0]
;return
true;}
void
open()
void
close()
void
run(
)void
stop()
void
setstatus
(int index)
private
: vector
> liftstatusgroup;
liftstatus* currentstatus;
};
很明顯可以看出,lift類中已經不存在switch分支,邏輯變得非常簡單了, 後續需要擴充套件新狀態的話,也不需要大規模修改lift類裡面的邏輯。
以下就是上述例子對應的類圖
9 C語言和設計模式(抽象工廠模式)
前面我們寫過的工廠模式實際上是對產品的抽象。對於不同的使用者需求,我們可以給予不同的產品,而且這些產品的介面都是一致的。而抽象工廠呢?顧名思義,就是說我們的工廠是不一定的。怎麼理解呢,舉個例子。假設有兩個水果店都在賣水果,都賣蘋果和葡萄。其中乙個水果店買白蘋果和白葡萄,另外乙個水果店賣紅蘋果和紅葡萄...
2 C 設計模式及實際應用 繼承
關於繼承和多型,它是物件導向設計思想的核心所在。它們的語法細節,很多書籍和教程上都有詳細的講解,這裡就不再贅述了,本節將重點講解繼承和多型的設計思想和實際應用場景。例如我們在開發一款手機遊戲裡面的彈窗介面,有使用者彈窗 好友彈窗 展示彈窗 設定彈窗 提示彈窗 警告彈窗,功能如下 實際專案中的功能會更...
設計模式 狀態模式 C
狀態模式主要解決當控制乙個物件狀態的轉換的條件表達過於複雜的情況,使得狀態的轉換不依賴於整體的操作。本文將通過乙個具體的例子說明狀態模式的應用。假設下面乙個場景 乙個新任務提交後,先是收集資料,資料收集完成後等等分配一台機器,分配到機器後就可以將此任務部署至此機器後就可以通知相關模組開始工作。先對此...