Head First設計模式之狀態模式

2021-09-25 00:25:20 字數 4011 閱讀 8670

定義:允許物件在內部狀態改變時改變它的行為, 物件看起來好像修改了它的類。

主要解決:物件的行為依賴於它的狀態(屬性),並且可以根據它的狀態改變而改變它的相關行為。

何時使用:**中包含大量與物件狀態有關的條件語句。

如何解決:將各種具體的狀態類抽象出來。

關鍵**:通常命令模式的介面中只有乙個方法。而狀態模式的介面中有乙個或者多個方法。而且,狀態模式的實現類的方法,一般返回值,或者是改變例項變數的值。也就是說,狀態模式一般和物件的狀態有關。實現類的方法有不同的功能,覆蓋介面中的方法。狀態模式和命令模式一樣,也可以用於消除 if...else 等條件選擇語句。

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

stateconcretestatea,concretestateb,concretestatec1、行為隨狀態改變而改變的場景。

2、條件、分支語句的代替者。

優點:

缺點:

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

designpatterns.statepattern

}class

account

//properties

public

double

balance

}public

state state

set

}public

void deposit(double

amount)

---

", amount);

console.writeline(

"balance =

", this

.balance);

console.writeline(

"status =

",this

.state.gettype().name);

console.writeline(

"");

}public

void withdraw(double

amount)

---

", amount);

console.writeline(

"balance =

", this

.balance);

console.writeline(

"status = \n",

this

.state.gettype().name);

}public

void

payinterest()

", this

.balance);

console.writeline(

"status = \n",

this

.state.gettype().name);}}

//////

the 'state' abstract class

/// abstract

class

state

set

}public

double

balance

set

}public

abstract

void deposit(double

amount);

public

abstract

void withdraw(double

amount);

public

abstract

void

payinterest();

}//////

a 'concretestate' class

//////

red indicates that account is overdrawn

/// ///

class

redstate : state

private

void

initialize()

public

override

void deposit(double

amount)

public

override

void withdraw(double

amount)

public

override

void

payinterest()

private

void

statechangecheck()}}

//////

a 'concretestate' class

//////

silver indicates a non-interest bearing state

/// ///

class

silverstate : state

public silverstate(double

balance, account account)

private

void

initialize()

public

override

void deposit(double

amount)

public

override

void withdraw(double

amount)

public

override

void

payinterest()

private

void

statechangecheck()

else

if (balance >upperlimit)}}

//////

a 'concretestate' class

//////

gold indicates an interest bearing state

/// ///

class

goldstate : state

public goldstate(double

balance, account account)

private

void

initialize()

public

override

void deposit(double

amount)

public

override

void withdraw(double

amount)

public

override

void

payinterest()

private

void

statechangecheck()

else

if (balance }}

}

現實中還有其他很多例子,比如自動販賣機、電梯等。

狀態模式的關鍵在於狀態變化時引起行為的變化,它是被動的觸發

策略模式的差別在於,它是由外部(client)主動引起行為的變化,可以隨意控制它想要執行的行為。

Head First設計模式之工廠模式

定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個.工廠方法讓類把例項化推遲到子類 1 抽象工廠角色 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。2 具體工廠角色 它含有和具體業務邏輯有關的 由應用程式呼叫以建立對應的具體產品的物件。3 抽象產品...

《Head First設計模式》之命令模式

命令模式就是將方法呼叫 method invocation 封裝起來。通過封裝方法呼叫,我們可以把運算塊包裝成形,所以呼叫此運算的物件不需要關心事情是如何進行的,只要知道如何使用包裝成形的方法來完成它就可以了。通過封裝方法呼叫,可以用在以下場景 記錄日誌或者重複使用這些封裝來實現撤銷 undo 我對...

Head First設計模式之組合模式

將物件組合成樹形結構來表現 整體 部分 層次結構。組合能讓客戶以一致的方法處理個別物件以及組合物件。主要部分可以被一致對待問題.組合模式主要包含三個角色 2.composite 容器構件 容器節點包含子節點,其子節點可以是葉子節點,也可以是容器節點,它提供乙個集合用於儲存子節點,實現了在抽象構件中定...