物件導向程式設計思想 狀態模式

2021-08-07 07:41:02 字數 3577 閱讀 4783

一、引言

上篇部落格中學習了中介者模式,我們留下了乙個問題,當出現多個玩家需要輸贏狀態條件判斷時,可不可以不去修改中介者類,因為如果每新增乙個條件判斷,就要修改中介者類,破壞了封裝,違背開閉原則。今天我們學習的內容就是要解決這種業務場景,狀態模式

二、狀態模式

定義:當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類

下面是狀態模式的結構圖:

下面是**demo:

//

維護乙個concretestate子類的例項,這個例項定義當前狀態

class

context

//可讀寫的state

public

state state

set"

); }

}//對請求做處理,並設定下乙個狀態

public

void

request()

}//抽象狀態類 定義乙個介面以封裝與context的乙個特定狀態相關的行為

1.確保了新增狀態及對應的行為時,不是去修改很長一大串if...else..邏輯判斷。消除龐大的分支語句

2.把各種狀態轉移邏輯分布到state類的子類中,更加利於擴充套件

下面是大話設計模式中的例子:

場景:上午狀態好,中午想睡覺,下午漸恢復,晚上苦煎熬

class

work

public

inthour;

public

inthour

set

}public

bool

finish;

public

bool

taskisfinish

set

}//設定當前狀態

public

void

setstate(state state)

public

void

writeprogram()

}abstract

class

state

class

forenoonstate : state

點,上午工作,精神充沛

",work.hour);

}else}}

class

noonstate : state

點,肚子餓了,午休,犯睏

",work.hour);

}else}}

class

afternoonstate: state

點,下午狀態還不錯,繼續努力

", work.hour);

}else}}

class

eveningstate: state

else

點,要加班哦,疲累至極

", work.hour);

}else}}

}class

sleepingstate: state

點,不行了,睡著了

", work.hour);}}

class

resetstate: state

點,下班了,回家了

分析:如果老闆哪天要求「20點以後強制下班」,只需要新增加乙個強制下班狀態,稍微修改下傍晚狀態類就可以了,而不會影響到其它狀態類

下面是上篇部落格中留下的問題,結合狀態模式和中介者模式處理,下面是**demo:

abstract

class

mediator

public

mediator(state state)

public

void

add(colleague colleague)

public

void

remove(colleague colleague)

public

void win(int

number)

}class

concretemediator : mediator

}abstract

class

state

class

concretestateawin : state

public

override

void win(int

number)

else}}

}class

concretestatebwin : state

public

override

void win(int

number)

else}}

}class

initstate : state

public

override

void win(int

number)

}abstract

class

colleague

public

abstract

void win(int

number,mediator mediator);

}class

concretecolleaguea : colleague

}class

concretecolleagueb : colleague

}class

program

");console.writeline($

"b的數量為");

分析:ok,解決了上面部落格中的提出的兩個問題,具體問題見上篇部落格

優點:1.將狀態判斷邏輯分到每個狀態裡面,減少了相互依賴,簡化邏輯

2.當有新的狀態出現時,可以通過新增狀態來進行擴充套件,擴充套件性好

缺點:1.當狀態較多時,concretestate類較多,增加系統開銷

適用場景:

1.當乙個物件的行為取決於它的狀態,並且必須在執行時刻根據狀態改變行為時,就可以考慮狀態模式

2.乙個操作中有龐大的分支結構,並且這些分支結構取決於它的狀態

物件導向程式設計思想 命令模式

一 引言 起初餐館吃飯都是客人和廚師直接溝通,菜譜是一樣的,可是客人多了的時候,有的客人可能有急事不吃了要退單,還有的客人點很多菜需要記錄類別和次序等現象,這時服務員角色的出現解決了問題。那麼面對某些無法抵禦變化的 緊耦合 的場景如何做程式設計呢?命令模式設計便出現了,使得 行為請求者 與 行為實現...

物件導向程式設計思想 外觀模式

一 引言 每逢去吃午飯路上,幾個同事都要討論一番投資理財的事情,時間久之,小白的我才勉強了解到 與 的區別,是自身直接與某只 交易,可以通過分紅或者低買高賣獲利 自身需要分析 多隻 的 如圖示一 而 是把錢交給 公司,有專業人員幫你分析 或債券等幫你理財 自身不需要直接關注 了,見圖示二 圖示一 圖...

物件導向程式設計思想

舉個最簡單點的例子來區分 有一天要請客吃飯,怎麼辦?有兩個方法 1 買菜,買調料,買肉,買酒水,然後下廚房動手炒菜 2 去飯店,點個 看出來區別了嗎?方法1是面向過程,方法2是物件導向。物件導向有什麼優勢?首先不需要知道各種菜式是怎麼做的,降低了耦合性。如果突然想換 了,對於方法1可能不太容易,因為...