詳解C++設計形式編程中對狀況形式的應用。本站提示廣大學習愛好者:(詳解C++設計形式編程中對狀況形式的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++設計形式編程中對狀況形式的應用正文
狀況形式:當一個對象的內涵狀況產生變更時,許可轉變其行動,這個對象看來像是轉變了其類。
狀況形式與戰略形式的UML圖簡直如出一轍,上面羅列了二者的分歧:
(1)可以經由過程情況類狀況的個數來決議是應用戰略形式照樣狀況形式。
(2)戰略形式的情況類本身選擇一個詳細戰略類,詳細戰略類不必關懷情況類;而狀況形式的情況類因為內在身分須要放進一個詳細狀況中,以便經由過程其辦法完成狀況的切換,是以情況類和狀況類之間存在一種雙向的聯系關系關系。
(3)應用戰略形式時,客戶端須要曉得所選的詳細戰略是哪個,而應用狀況形式時,客戶端不必關懷詳細狀況,情況類的狀況會依據用戶的操作主動轉換。假如體系中某個類的對象存在多種狀況,分歧狀況下行動有差別,並且這些狀況之間可以產生轉換時應用狀況形式;假如體系中某個類的某一行動存在多種完成方法,並且這些完成方法可以交換時應用戰略形式。
構造圖
實例:
namespace State_DesignPattern
{
using System;
abstract class State
{
protected string strStatename;
abstract public void Pour();
// do something state-specific here
}
class OpenedState : State
{
public OpenedState ()
{
strStatename = " Opened " ;
}
override public void Pour()
{
Console.WriteLine( " pouring " );
Console.WriteLine( " pouring " );
Console.WriteLine( " pouring " );
}
}
class ClosedState : State
{
public ClosedState()
{
strStatename = " Closed " ;
}
override public void Pour()
{
Console.WriteLine( " ERROR - bottle is closed - cannot pour " );
}
}
class ContextColaBottle
{
public enum BottleStateSetting {
Closed,
Opened
} ;
// If teh state classes had large amounts of instance data,
// we could dynamically create them as needed - if this demo
// they are tiny, so we just create them as data members
OpenedState openedState = new OpenedState();
ClosedState closedState = new ClosedState();
public ContextColaBottle ()
{
// Initialize to closed
CurrentState = closedState;
}
private State CurrentState;
public void SetState(BottleStateSetting newState)
{
if (newState == BottleStateSetting.Closed)
{
CurrentState = closedState;
}
else
{
CurrentState = openedState;
}
}
public void Pour()
{
CurrentState.Pour();
}
}
/// <summary>
/// Summary description for Client.
/// </summary>
public class Client
{
public static int Main( string [] args)
{
ContextColaBottle contextColaBottle = new ContextColaBottle();
Console.WriteLine( " initial state is closed " );
Console.WriteLine( " Now trying to pour " );
contextColaBottle.Pour();
Console.WriteLine( " Open bottle " );
contextColaBottle.SetState(ContextColaBottle.BottleStateSetting.Opened);
Console.WriteLine( " Try to pour again " );
contextColaBottle.Pour();
return 0 ;
}
}
}
實用場景
(1)一個對象的行動取決於它的狀況, 而且它必需在運轉時辰依據狀況轉變它的行動。
(2)一個操作中含有宏大的多分支的前提語句,且這些分支依附於該對象的狀況。這個狀況平日用一個或多個列舉常量表現。平日, 有多個操作包括這一雷同的前提構造。S t a t e形式將每個前提分支放入一個自力的類中。這使得你可以依據對象本身的情形將對象的狀況作為一個對象,這一對象可以不依附於其他對象而自力變更。