/** * 狀態模式 * @author TMAC-J * 狀態模式和策略模式很像,其實仔細研究發現完全不一樣 * 策略模式各策略之間沒有任何關係,獨立的 * 狀態模式各狀態之間介面方法都是一樣的 * 另外一個區別是狀態模式主要用於狀態經常發生改變的情況 * 策略模式發生在不改變的情況,策略模式一般... ...
/** * 狀態模式 * @author TMAC-J * 狀態模式和策略模式很像,其實仔細研究發現完全不一樣 * 策略模式各策略之間沒有任何關係,獨立的 * 狀態模式各狀態之間介面方法都是一樣的 * 另外一個區別是狀態模式主要用於狀態經常發生改變的情況 * 策略模式發生在不改變的情況,策略模式一般在CONTEXT初始化時就決定了,並且中途不會改變 * 換句話說,策略模式只是在對象初始化的時候更改執行模式,而狀態模式是根據對象實例的周期時間而動態地改變對象實例的執行模式。 * 狀態模式的方法都是固定的,策略模式有不同的策略,可以隨意些不同方法 * key:策略模式是可以擴展不同的策略演算法,而狀態模式是以繼承代替if-else,可以擴展不同 * 情況,他能做的事情是固定不變的! * if-else特別多的時候用這種方式 */ public class StatePattern { /** * 這個介面負責定義所有的方法 * 功能在這個介面加 */ interface State{ void preChannel(); void nextChannel(); void turnon(); void turndown(); } public class PoweronState implements State{ @Override public void preChannel() { System.out.println("pre"); } @Override public void nextChannel() { System.out.println("next"); } @Override public void turnon() { System.out.println("turnon"); } @Override public void turndown() { System.out.println("turnoff"); } } public class PoweroffState implements State{ /** * 關機狀態不做任何操作 */ @Override public void preChannel() { // TODO Auto-generated method stub } @Override public void nextChannel() { // TODO Auto-generated method stub } @Override public void turnon() { // TODO Auto-generated method stub } @Override public void turndown() { // TODO Auto-generated method stub } } /** * 這個介面負責定義不同狀態 * 狀態在這個介面加 */ interface PowerController{ void poweron(); void poweroff(); } /** * 需要寫明不同的方法和不同的狀態 * */ public class TVController implements PowerController{ private State state; public void setState(State state){ this.state = state; } @Override public void poweron() { setState(new PoweronState()); } @Override public void poweroff() { setState(new PoweroffState()); } public void preChannel() { state.preChannel(); } public void nextChannel() { state.nextChannel(); } public void turnon() { state.turnon(); } public void turndown() { state.turndown(); } } public class Client{ public void test(){ TVController tvController = new TVController();//這個時候只需要創建這個控制類就夠啦 tvController.setState(new PoweronState());//傳遞狀態,相當於if /** * 下麵這四個直接寫就可以了,不用管什麼狀態了,是不是很爽,到時候如果有不同的狀態加入的話 * 只需要在控制器介面中添加相應的方法,或者是在寫一個介面讓控制器實現就可以啦 * 其他的都不用管!!! */ tvController.preChannel(); tvController.nextChannel(); tvController.turnon(); tvController.turndown();; } } }