16 23 狀態模式

2021-10-07 15:08:49 字數 3467 閱讀 3418

狀態模式(state pattern)

類的行為是基於它的狀態改變的,在狀態模式中,我們建立表示各種狀態的物件和乙個行為隨著狀態物件改變而改變的 context 物件。

現在我們有乙個紅綠燈變化,紅、黃、綠,不同燈時不同的提示,當然顏色就是提示,每乙個燈之後切換一下,最後形成閉環,比如:紅->黃->綠->紅

public class lightfactory

public static void show()

}public static void trun()

}}public enum lightcolor

/// 介面呼叫

private void btn******_click(object sender, eventargs e)

介面效果如下:

**嚴重違背了單一原則,對於單一的顏色要做的事情耦合在一起,**結構不清晰

個人認為架構師的職責不是為了當下,而是為了變化擴充套件,現在需要陸續增加燈,藍燈以及白燈,基於此當發生如下改動時則又違背了開閉原則,且對於燈的管理混亂,設想我們現在燈增加10個,基本上就是雜亂無章的。

首先先抽象成員,封裝物件

public inte***ce lightbase

void show();

void trun();

}public class redlight : lightbase

}public void show()

public void trun()

}public class yellowlight : lightbase

}public void show()

public void trun()

}public class greenlight : lightbase

}public void show()

public void trun()

}

然後基於上述**,我們來填充狀態控制,最終**如下:

public abstract class lightbase

public abstract void show();

public abstract void trun(lightcontext plightcontext);

}public class redlight : lightbase

}public override void show()

public override void trun(lightcontext plightcontext)

}public class yellowlight : lightbase

}public override void show()

public override void trun(lightcontext plightcontext)

}public class greenlight : lightbase

}public override void show()

public override void trun(lightcontext plightcontext)

}public class lightcontext

public void show()

public void trun()

}介面呼叫:

private void btnstate_click(object sender, eventargs e)

效果如下:

基於上述的例子我們增加**如下:

public enum lightcolor

public abstract class lightbase

public abstract void show();

public abstract void trun(lightcontext plightcontext);

}public class redlight : lightbase

}public override void show()

public override void trun(lightcontext plightcontext)

}public class whiteight : lightbase

}public override void show()

public override void trun(lightcontext plightcontext)

}public class yellowlight : lightbase

}public override void show()

public override void trun(lightcontext plightcontext)

}public class greenlight : lightbase

}public override void show()

public override void trun(lightcontext plightcontext)

}public class bluelight : lightbase

}public override void show()

public override void trun(lightcontext plightcontext)

}public class lightcontext

public void show()

public void trun()

}介面呼叫

只有動手之後才會發下改起來有多簡單,動手先模擬一下業務變化時修改**

ps:單純對於這個例子,我們發現在public abstract void trun(lightcontext plightcontext);中每次增加或刪除修改時我們都要進行修改相鄰類,那麼我們有沒有辦法將該資訊修改,在這個 案例中是可以的,應為每個lightbase中都有乙個lightcolor而lightcolor有乙個列舉,我們是否可以用lightcolor的順序形成閉環操作物件的狀態轉換呢?答案當然時肯定的。

[此案例只敘述一下]

將上述案例進行變形,現在當紅燈時可以變化為藍燈或者白燈,白燈可以變化為藍燈或者黃燈,黃燈可以變化為綠燈或者藍燈…而變化時使用者的輸入,那麼這個時候再回到簡單實現中的工廠中去嘗試流轉改變試試…

445574888)]

16 2 3 啟動和關閉Apache

安裝 完成後就可以啟動 apache 服務。apache 的啟動關閉都是通過 安裝目錄 bin 目錄下的 apachectl 命令進行管理的。啟動 apache 服務,如下所示。apachectl start 關閉 apache 服務,如下所示。apachectl stop 重啟 apache 服務...

設計模式 狀態模式

狀態模式 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況,把狀態的判斷邏輯轉移到表示不同狀態的一些列類當中,可以把複雜的判斷邏輯簡化。當乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行...

設計模式 狀態模式

1.概述 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。2.解決的問題 主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。3.模式中的角色 3.1 上下文環境 context 它定義了客...