




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 所謂狀態(tài)模式是指:當一個對象的內部狀態(tài)改變時,它的行為也隨之改變,如何解藕狀態(tài)與行為之間的藕合關系,且避免大量的if.else語句的出現,從而使得“對象看起來似乎修改了它的類”。 狀態(tài)模式的實現非常的簡單,就是將狀態(tài)抽象出來,然后在狀態(tài)中處理這些請求,這也是面向對象抽象特征的基本應用。 狀態(tài)模式的UML圖如下:
2、; 相關角色: 1、狀態(tài)屬主角色Context: 就是狀態(tài)所描述的事物,如一只狗的狀態(tài)為睡,站,走,跑,叫.,那么我們所定義的一個類"Dog"就是這里的Context。此角色要定義一些外部關注的接口或服務功能等,同時還要維護一個具體狀態(tài)角色的實例對象。 2、抽象狀態(tài)角色State:它是抽象類或接口,是具體狀態(tài)角色的基類,它定義了具體狀態(tài)角色所共有的行為并進
3、行封裝,由具體狀態(tài)角色予以不同的實現。 3、具體狀態(tài)角色 Concrete State:繼承自抽象狀態(tài)角色,并具體實現抽象狀態(tài)角色定義的接口功能,同時還提供了不同具體狀態(tài)角色間的切換判斷以根據狀態(tài)屬主角色對象的某些條件來決定何時以及如何進行狀態(tài)的切換。 下面我們用代碼來示例State狀態(tài)模式。 程序如下圖:
4、60; 一、狀態(tài)模式基本思路示例 1、狀態(tài)屬主角色Context:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MyStatePattern class Context
5、; #region State屬性 private State _state; public State State
6、0; get return _state; set
7、60; _state = value; Console.WriteLine("State:0", _state.GetType(.Name;
8、60; #endregion #region 構造函數 public Context(State state
9、 this._state = state; #endregion #region 服務請求
10、60; public void Request( _state.Handle(this; #endregion
11、0; 2、抽象狀態(tài)角色State:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MyStatePattern #region 抽象狀態(tài)角色 abstract class State &
12、#160; public abstract void Handle(Context context; #endregion 3、具體狀態(tài)角色Concrete State:using System;using System.Collections.Generic;using System.Linq;using System.Text;names
13、pace MyStatePattern /定義具體狀態(tài)角色 #region 具體狀態(tài)角色A class ConcreteStateA:State public override void Handle(Context context
14、60; context.State = new ConcreteStateB(; #endregion #region&
15、#160;具體狀態(tài)角色B class ConcreteStateB : State public override void Handle(Context context
16、160; context.State = new ConcreteStateA(; #endregion 4、客戶應用: #region 基本思路
17、示例 Console.WriteLine("-基本思路示例-" Context c = new Context(new ConcreteStateA(;
18、; c.Request(; c.Request(; c.Request(; c.Request(;
19、60; Console.ReadKey(; #endregion 二、俱樂部會員服務的狀態(tài)模式實現 定義一個俱樂部,它的顧客有三個狀態(tài):一般訪客,普通會員,貴賓會員。每個顧客都有一個帳戶,帳戶上存放顧客的存款,根據存款的不同數量切換會員的級別,當顧客提請俱樂
20、部的服務時,俱樂部將根據顧客的當前級別提供與其級別對應的服務內容。當然,顧客可以存入或消費,并及時修改他們的帳戶。 1、狀態(tài)屬主角色Context:ClubAccountusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MyStatePattern class ClubAccount
21、160; #region 帳戶姓名屬性 private string _customerName; public string CustomerName
22、0; get return _customerName; set _customerName = value;
23、 #endregion #region 帳戶狀態(tài)State屬性 /ClubAccount類中包含了State類對象實例,而正是因為State類的具體對象實例(VIPState,MemberSate,VisitorState決定了ClubAccount類對象的不同具體表現 &
24、#160;/因為ClubAccount類的Deposit,Cost,Service動作都是依托(VIPState,MemberSate,VisitorState類對象來實現的 private ClubState _state; public ClubState State
25、160; get return _state; set _state = value;
26、 #endregion #region 帳戶Balance屬性 public double Balance &
27、#160;get return _state.Balance; #endregion #region 構造函數 public ClubAccount(stri
28、ng name / 新注冊的客戶默認為Visitor類型客戶狀態(tài) /同時通過此處的this把Account帳戶與State關聯起來
29、; this.CustomerName = name; this.State = new VisitorState(0.0, this;
30、 public ClubAccount(string name,ClubState state this.CustomerName = name; this.S
31、tate = state; #endregion #region 存款 public void Deposit(double amount
32、 _state.Deposit(amount; #endregion #region 取款&
33、#160; public void Cost(double amount _state.Cost(amount;
34、60; #endregion #region 俱樂部相關服務 public void ClubService(
35、; _state.ClubService(; #endregion 2、抽象狀態(tài)角色State:ClubStateusing System;using System.Collections.Generic;using System.Linq;using System.Text;names
36、pace MyStatePattern /俱樂部會員狀態(tài)類 abstract class ClubState protected double lowerLimit; /下限 protected
37、60;double upperLimit; /上限 #region Account屬性 protected ClubAccount account; public ClubAccount Account
38、; get return account; set account = value; &
39、#160; #endregion #region Balance屬性 protected double balance; public double Balance
40、; get return balance; set balance = value; &
41、#160; #endregion public abstract void Deposit(double amount; /存錢 public abstract void Cost(double
42、0;amount; /消費 public abstract void ClubService(; /享受服務 3、具體狀態(tài)角色Concrete State:ClubRealStatesusing System;using
43、;System.Collections.Generic;using System.Linq;using System.Text;namespace MyStatePattern /這時定義一系列具體的State類 /這些類繼承自抽象的ClubState類,并完成ClubState類定義的功能 /其中包括狀態(tài)判斷與切換,它們將根據ClubAccount的當前balance屬性來決定是否切換狀態(tài)以及向哪個狀態(tài)切換
44、0; /而ClubAccount已經在構造ClubState類時作為屬性傳遞給了它 #region 一般消費者 class VisitorState : ClubState /構造函數中必須有ClubState對象,因為它必須像接力棒一樣把上一個狀態(tài)的State對象交接過來,在進行狀態(tài)切換的同時保留上一
45、級狀態(tài)的歷史數據 public VisitorState(ClubState state : this(state.Balance,state.Account
46、0; public VisitorState(double balance,ClubAccount account &
47、#160; this.balance = balance; this.Account = account; Initialize(; &
48、#160; private void Initialize( lowerLimit = 0.0; upperLimit =&
49、#160;100; public override void Deposit(double amount balance
50、+= amount; Console.WriteLine("你這次存入了0元", amount.ToString(; StateChangeCheck(; &
51、#160; public override void Cost(double amount balance -= amount;
52、0; Console.WriteLine("你這次消費了0元", amount.ToString(; StateChangeCheck(; private void StateChangeChec
53、k( if (balance >= upperLimit
54、60; account.State = new MemberState(this; Console.WriteLine("你當前帳戶金額為 0,你可以享受普通會員服務!",balance.ToString(;
55、 public override void ClubService( Consol
56、e.WriteLine("你申請了服務=>俱樂部提供一般客戶的服務內容!" #endregion #region 普通會員 class MemberState : ClubState
57、; /構造函數中必須有ClubState對象,因為它必須像接力棒一樣把上一個狀態(tài)的State對象交接過來,在進行狀態(tài)切換的同時保留上一級狀態(tài)的歷史數據 public MemberState(ClubState state : this(state.Balance,
58、 state.Account this.balance = state.Balance; public MemberState(do
59、uble balance, ClubAccount service this.balance = balance; this.account = se
60、rvice; Initialize(; private void Initialize(
61、160; lowerLimit = 100.0; upperLimit = 1000; public override void
62、;Deposit(double amount balance += amount; Console.WriteLine("你這次存入了0元", amount.T
63、oString(; StateChangeCheck(; public override void Cost(double amount
64、0; balance -= amount; Console.WriteLine("你這次消費了0元", amount.ToString(;
65、0; StateChangeCheck(; private void StateChangeCheck( if (balance
66、160;< lowerLimit account.State = new VisitorState(this; &
67、#160; Console.WriteLine("你當前帳戶金額為 0,你只能享受訪客級會員服務!", balance.ToString(; else if(balance >=
68、 upperLimit account.State = new VIPState(this; &
69、#160; Console.WriteLine("你當前帳戶金額為 0,你可以享受貴賓級會員服務!", balance.ToString(; public o
70、verride void ClubService( Console.WriteLine("你申請了服務=>俱樂部提供普通會員的服務內容!"
71、; #endregion #region 貴賓會員 class VIPState : ClubState /構造函數中必須有ClubState對象,因為它必須像接力棒一樣把上一個狀態(tài)的State對象交接過來,在進行狀態(tài)切換的同時保留上一級狀態(tài)的歷史數據
72、160; public VIPState(ClubState state:this(state.Balance,state.Account this.balance
73、 = state.Balance; public VIPState(double balance, ClubAccount service
74、0; this.balance = balance; this.account = service; Initialize(;
75、0; private void Initialize( lowerLimit = 1000.0;
76、 public override void Deposit(double amount balance += amount; Consol
77、e.WriteLine("你這次存入了0元", amount.ToString(; StateChangeCheck(; public override void Cost(double amoun
78、t balance -= amount; Console.WriteLine("你這次消費了0元,你的帳戶還有1元",amount.ToString(,balance.ToString(; StateChangeCheck(;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- “JUZI漢語”軟件在HSK詞匯教學中的應用研究
- JS銀行ESG管理體系優(yōu)化研究
- 讀后續(xù)寫教學中高中英語教師的教學信念對其教學行為影響的個案研究
- 玩具設計核心要素與創(chuàng)新實踐
- 孩子作業(yè)書寫培訓
- 電信網絡安全班會
- 腦動靜脈畸形MRI診斷
- 頤和園英文課件
- 三減三健健康知識教育
- 心內科胸悶氣促的護理診斷
- GA 6-2004消防員滅火防護靴
- 南京工業(yè)大學部分教學大綱
- 酒店住宿水單模板word酒店流水單
- CMA全套文件(質量手冊+程序文件+作業(yè)指導書+表格)
- 聽覺識別能力評估記錄表(音位對比式/聲母)
- 《紫閨祕書》杏溪浣香主人撰演示教學
- 數據中心巡檢機器人解決方案
- 露天礦山安全生產責任制
- 中國服裝發(fā)展史(完整版)
- 麗聲北極星分級繪本第四級下 The Camping Trip課件
- 山西特崗教師招聘考試真題
評論
0/150
提交評論