題目1:通過**描述每一天的不同時間段的工作效率
分析: 首先確定,工作狀態指正在工作,或者以及下班這些情況,而這些情況所受影響的因素包括:當前時間以及任務是否已經完成。所以在work中需要兩個屬性:hour和finish。然後根據這兩個屬性直接判斷當前的工作狀態即可。
實現:class program
public class work
set
}public bool finish
set
}///
/// 根據時間來判斷當前的工作狀態如何
///
/// 方法過長
///
public void writeprogram()
點 上午工作,精神百倍", hour);
}else if (hour < 13)
點 餓了,午飯;犯睏,午休", hour);
}else if (hour < 17)
點 下午狀態還不錯,繼續努力", hour);
}else
點 下班回家了", hour);
}else
點 加班哦,疲憊至極", hour);
}else
點 不行了,睡著了。", hour);}}
}}}}
題目2:從1中可以很明顯的看出writeprogram()函式幾乎承載了所有的判斷處理,且函式函式過長,所以在work類中違背了「單一職責原則"。
分析: 物件導向設計就是希望做到**的責任分解,在這個情況中,我們將所有的判斷全部新增在了writeprogram()乙個函式中,不僅是函式冗長,如果我臨時新增新的情況,可能對原來判斷有出入的時間也會造成很多麻煩,對於將來的修改百害而無一利。
所以我們需要根據情況來分解函式和類。
本題目中,我們需要獲得當前的工作狀態,而這個的直接影響因素包括時間hour和是否已經完成任務taskfinished。
所以我們根據當前的時間可以很明顯的分為不同時間段,也就是writeprogram()的if,else都可以自己單獨擁有乙個類,他們都繼承於同乙個抽象類state即可。
然後我們初始化直接進程式設計客棧入forenoonstate類,畢竟每天早上的時間不會變,如果當前時間不再是早上,那麼我們就需要進入下乙個時間段進行判斷,所以在forenoonstate類中我們需要加入判斷,如果當前時間滿足早上的時間段,顯示工作狀態,如果當前時間不再是早上的時間段,那麼我們進入下乙個時間段,以此類推,找到我們當前時間段的工作狀態。
實現:class program
public class work
public int hour
set
}public bool taskfinished
set
}public void setstate(state s)
public void writeprogram()
}///
/// 抽象狀態
///
public abstract class state
///
/// 上午工作狀態
///
/// 邏輯是:根據時間推移,上午工作後,移至中午午飯時間
///
public class forenoonstate : state
上午工作,精神百倍", w.hour);
}else}}
///
/// 中午工作狀態
///
/// 邏輯是:根據時間推移,午休時間後,移至下午工作時間
///
public class noonstate : state
餓了,午飯;犯睏,午休", w.hour);
}else}}
///
/// 下午工作狀態
///
/// 邏輯是:根據時間推移,下午工作後,移至晚間工作狀態
///
public class afternoonstate : state
下午狀態還不錯,繼續努力", w.hour);
}else}}
///
/// 晚間工作狀態
///
/// 邏輯是:已完成工作的可以準點下班,移至下班休息狀態
ghoabj /// 未完成工作的繼續加班:這裡又分為未超過人體承受能力的(21小時)就繼續加班(此處已是最底層,沒有再多加其他的操作了)
/// 超過21小時的將移至睡眠狀態
///
public class eveningstate : state
else
加班哦,疲憊至極", w.hour);
}else}}
}///
/// 睡眠狀態
///
/// 最底層,不要再次呼叫,會無限往復的
///
public class sleepingstate : state
點 不行了,睡著了", w.hour);}}
///
/// 下班休息狀態
///
/// 最底層,不要再次呼叫,會無限往復的
///
public class reststate : state
點 下班回家", w.hour);}}
}}
總結:這裡用到的就是狀態模式(state):當乙個物件的內在狀態改變時,允許改變其行為,這個物件看起來像是改變了其類。
狀態模式主要解決的是當控制乙個物件狀態轉換的調節表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以吧複雜的判斷邏輯簡化。
狀態模式的好處是將與特定狀態相關的行為區域性化,並且將不同狀態的行為分割開來。
注:文中所有**及知識點均來自於《大話設計模式》,本人屬於邊學邊看邊敲**邊總結的階段。
本文標題: c#學習筆記之狀態模式詳解
本文位址:
設計模式學習筆記之狀態模式
定義 狀態模式允許物件在內部狀態改變時改變它的行為,物件看起來好像修改了它的類。解決問題 主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。結構圖 狀態模式所涉及到的角色有 環境 context 角色,也成上下文 ...
C 設計模式 狀態模式詳解
狀態模式 當乙個物件內在狀態改變時允許改變其行為,看起來像改變了棋類。狀態模式,顧名思義就是表示乙個物件的狀態,並且這些狀態不一定是互斥的,常見的比如手機狀態,有開機 關機 沒有訊號 正在通話。這四種狀態中,比如手機處於關機狀態時,就不能進行通話,只能進行開機 手機沒有訊號的時候,就不能進行打 只能...
設計模式學習筆記 狀態模式
定義 當乙個物件內在的狀態改變時,允許其改變行為,這個物件看起來像是改變了其類。狀態模式不太好理解,我現在還沒有完全理解,這個模式給我的第一印象就是比較亂,給我的感覺好像是兩個類互相依賴,呼叫 的方法,呼叫 的方法,弄的好亂,所以這個狀態模式就不用通用類圖去描述了,那樣會不知所云,還是舉乙個實際的例...