State状态模式
1、簡介
在日常開發(fā)中,某些對象的狀態(tài)如果發(fā)生改變,對應(yīng)的行為也將發(fā)生改變,那么如何在運行時根據(jù)對象的狀態(tài)動態(tài)的改變對象的行為,同時不產(chǎn)生緊耦合關(guān)系(即使用if else或者swith所帶來的緊耦合關(guān)系).即對擴(kuò)展開放,對修改關(guān)閉一開閉原則.
?
2、案例
假設(shè)用戶提出了一個需求,有三類文檔對象,他們都由Read、Update、Write的功能,且分為只讀文檔、只改文檔、只寫文檔,且在編寫代碼時,他們的RUW(R-Read)功能各不相同,即每一類的狀態(tài)文檔,在運行時,他們的Read、Write、Update的代碼邏輯各不相同,這個時候該如何通過狀態(tài)模式編寫代碼,很顯然,如果不用State模式,可以通過if else或者swith可以很輕松的完成需求.但是那樣的代碼耦合度高,且修改時,代價太大,容易影響現(xiàn)有代碼的邏輯,給測試增加壓力,因為你每一次對單一文檔對象的修改都會影響其他所有文檔對象的運行.下面使用State狀態(tài)模式來完成這個需求.
?
3、代碼實戰(zhàn)
public static void Main(string[] args){var manager = new DocumentManage(new ReadOnlyDocument());var content=manager.Read();Console.WriteLine(content);Console.ReadKey();}/// <summary>/// 狀態(tài)文檔方法約束接口/// </summary>public interface IStatedDocument{string Read();void Write();void Update();}/// <summary>/// 抽象狀態(tài)文檔對象/// </summary>public abstract class StatedDocument: IStatedDocument{public abstract string Read();public abstract void Write();public abstract void Update();}/// <summary>/// 只讀文檔對象/// </summary>public class ReadOnlyDocument : StatedDocument{public override string Read(){return "只讀文檔內(nèi)容";}public override void Update(){throw new Exception("只讀文檔,無法修改其內(nèi)容");}public override void Write(){throw new Exception("只讀文檔,無法寫入內(nèi)容");}}/// <summary>/// 文檔管理對象/// </summary>public class DocumentManage: IStatedDocument{private StatedDocument _statedDocument;/// <summary>/// 可以通過構(gòu)造函數(shù)傳入具體的文檔,或者Set方法/// </summary>public DocumentManage(StatedDocument statedDocument){_statedDocument = statedDocument;}public string Read(){return _statedDocument.Read();}public void Update(){_statedDocument.Update();}public void Write(){_statedDocument.Write();}}ok,可以看到state狀態(tài)模式很好的完成了需求,而且每當(dāng)用戶提出一種新的需求,如編寫一個只讀只寫文檔,你就可以通過擴(kuò)展類的方式,通過編寫一個只讀只寫文檔類,來完成他的需求,而且每次發(fā)布模塊,只需要測新類型的功能是否ok,不需要測其他的功能,因為狀態(tài)模式是符合開閉原則,對擴(kuò)展方法,對修改關(guān)閉.且所有的上下文共享一個State對象,各個狀態(tài)文檔對象通過子類的方法展現(xiàn),如果狀態(tài)發(fā)生改變,那么其狀態(tài)下的方法全都會改變.
?
轉(zhuǎn)載于:https://www.cnblogs.com/GreenLeaves/p/10594153.html
總結(jié)
- 上一篇: 登录微软账号的Windows电脑如何远程
- 下一篇: 中国好声音2020年的播出时间是多少