定義:允許物件在內部狀態改變時改變它的行為, 物件看起來好像修改了它的類。
主要解決:物件的行為依賴於它的狀態(屬性),並且可以根據它的狀態改變而改變它的相關行為。
何時使用:**中包含大量與物件狀態有關的條件語句。
如何解決:將各種具體的狀態類抽象出來。
關鍵**:通常命令模式的介面中只有乙個方法。而狀態模式的介面中有乙個或者多個方法。而且,狀態模式的實現類的方法,一般返回值,或者是改變例項變數的值。也就是說,狀態模式一般和物件的狀態有關。實現類的方法有不同的功能,覆蓋介面中的方法。狀態模式和命令模式一樣,也可以用於消除 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 容器構件 容器節點包含子節點,其子節點可以是葉子節點,也可以是容器節點,它提供乙個集合用於儲存子節點,實現了在抽象構件中定...