摘要:前言當(dāng)代碼中出現(xiàn)多重語(yǔ)句或者語(yǔ)句時(shí)。代替多重分支這個(gè)情況的代替方式是可以為晴天時(shí)處理邏輯下雨時(shí)處理邏輯陰天時(shí)處理邏輯策略模式使用策略模式可以代替多重和語(yǔ)句,讓代碼維護(hù)變得更加簡(jiǎn)單。狀態(tài)模式允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變其行為。
前言
當(dāng)代碼中出現(xiàn)多重if-else語(yǔ)句或者switch語(yǔ)句時(shí)。弊端之一:如果這樣的代碼出現(xiàn)在多處,那么一旦出現(xiàn)需求變更,就需要把所有地方的if-else或者switch代碼進(jìn)行更改,要是遺漏了某一處,那么程序就會(huì)出錯(cuò)。弊端之二:代碼邏輯難以理解。
衛(wèi)語(yǔ)句衛(wèi)語(yǔ)句的使用,并不能改變前言說(shuō)的弊端:一旦需求更改,需要修改所有使用更改需求的if-else代碼塊。不過(guò)使用衛(wèi)語(yǔ)句可以讓自己或者代碼維護(hù)人員很容易的了解代碼的含義。
代替異常分支所謂的異常分支就是普通情況之外的分支,這種情況的下的if-else可以用
if (condition) return obj;
代替。
代替多重if-else分支這個(gè)情況的代替方式是可以為
if (isSunshine()) { // 晴天時(shí)處理邏輯 } if (isRain()) { // 下雨時(shí)處理邏輯 } if (isOvercast()) { // 陰天時(shí)處理邏輯 } ...策略模式
使用策略模式可以代替多重if-else和switch語(yǔ)句,讓代碼維護(hù)變得更加簡(jiǎn)單。
策略模式UML:
環(huán)境(Context)角色:持有一個(gè)Strategy的引用
抽象策略(Strategy)角色:這是一個(gè)抽象角色,通常由一個(gè)接口或抽象類實(shí)現(xiàn)
具體策略(ConcreteStrategy)角色:包裝了相關(guān)的算法或行為
策略模式代碼模板:
package xyz.zeling.test.strategy.template; import xyz.zeling.test.strategy.template.base.Strategy; /** * @description 環(huán)境角色 * @author zeling * @date 2018年1月14日 下午8:43:58 */ public class Context { /** * 策略對(duì)象 */ private Strategy strategy; /** * @param strategy 具體策略對(duì)象 */ public Context(Strategy strategy) { this.strategy = strategy; } /** * @description 執(zhí)行策略方法 * @date 2018年1月14日 下午8:43:31 */ public void contextInterface() { strategy.strategyInterface(); } }
package xyz.zeling.test.strategy.template.base; /** * @description 抽象策略角色 * @author zeling * @date 2018年1月14日 下午8:41:14 */ public interface Strategy { /** * @description 策略方法 * @date 2018年1月14日 下午8:41:00 */ void strategyInterface(); }
package xyz.zeling.test.strategy.template; import xyz.zeling.test.strategy.template.base.Strategy; /** * @description 具體策略類A * @author zeling * @date 2018年1月14日 下午8:45:00 */ public class ConcreteStrategyA implements Strategy { @Override public void strategyInterface() { // TODO Auto-generated method stub } }
package xyz.zeling.test.strategy.template; import xyz.zeling.test.strategy.template.base.Strategy; /** * @description 具體策略類B * @author zeling * @date 2018年1月14日 下午8:45:00 */ public class ConcreteStrategyB implements Strategy { @Override public void strategyInterface() { // TODO Auto-generated method stub } }
package xyz.zeling.test.strategy.template; import xyz.zeling.test.strategy.template.base.Strategy; /** * @description 具體策略類C * @author zeling * @date 2018年1月14日 下午8:45:00 */ public class ConcreteStrategyC implements Strategy { @Override public void strategyInterface() { // TODO Auto-generated method stub } }
實(shí)例應(yīng)用:水果有不同種類,每種水果對(duì)應(yīng)不同價(jià)格,用策略模式實(shí)現(xiàn)。
package xyz.zeling.test.strategy.demo.base; /** * @description 抽象策略,水果接口 * @author zeling * @date 2018年1月14日 下午3:01:20 */ public interface Fruit { /** * @description 輸出對(duì)應(yīng)價(jià)格 * @date 2018年1月14日 下午3:03:07 */ void price(); }
package xyz.zeling.test.strategy.demo; import xyz.zeling.test.strategy.demo.base.Fruit; /** * @description 具體策略,蘋果類 * @author zeling * @date 2018年1月14日 下午3:04:17 */ public class Apple implements Fruit { @Override public void price() { System.out.println("蘋果的價(jià)格!"); } }
package xyz.zeling.test.strategy.demo; import xyz.zeling.test.strategy.demo.base.Fruit; /** * @description 具體策略,香蕉 * @author zeling * @date 2018年1月14日 下午3:06:52 */ public class Banana implements Fruit { @Override public void price() { System.out.println("香蕉的價(jià)格!"); } }
package xyz.zeling.test.strategy.demo; import xyz.zeling.test.strategy.demo.base.Fruit; /** * @description 具體策略,梨 * @author zeling * @date 2018年1月14日 下午3:08:19 */ public class Pear implements Fruit { @Override public void price() { System.out.println("梨的價(jià)格!"); } }
package xyz.zeling.test.strategy.demo; import xyz.zeling.test.strategy.demo.base.Fruit; /** * @description 策略環(huán)境,輸出水果價(jià)格 * @author zeling * @date 2018年1月14日 下午3:09:31 */ public class FruitPrice { /** * 策略對(duì)象 */ private Fruit fruit; /** * @param fruit 策略對(duì)象 */ public FruitPrice(Fruit fruit) { this.fruit = fruit; } /** * @description 輸出水果價(jià)格 * @date 2018年1月14日 下午3:12:26 */ public void printFruitPrice() { fruit.price(); } }
客戶端
/** * @description 使用策略模式:針對(duì)一組算法,將每一個(gè)算法封裝到具有共同接口的獨(dú)立的類 * @date 2018年1月14日 下午3:17:11 */ public static void useStrategy() { // 具體使用策略 Fruit apple = new Apple(); // 將策略放入環(huán)境中并執(zhí)行策略 new FruitPrice(apple).printFruitPrice(); }狀態(tài)模式
狀態(tài)模式類圖:
說(shuō)明:
環(huán)境(Context)角色,也成上下文:定義客戶端所感興趣的接口,并且保留一個(gè)具體狀態(tài)類的實(shí)例。這個(gè)具體狀態(tài)類的實(shí)例給出此環(huán)境對(duì)象的現(xiàn)有狀態(tài)
抽象狀態(tài)(State)角色:定義一個(gè)接口,用以封裝環(huán)境(Context)對(duì)象的一個(gè)特定的狀態(tài)所對(duì)應(yīng)的行為
具體狀態(tài)(ConcreteState)角色:每一個(gè)具體狀態(tài)類都實(shí)現(xiàn)了環(huán)境(Context)的一個(gè)狀態(tài)所對(duì)應(yīng)的行為
策略模式代碼模板:
package xyz.zeling.test.state.template.base; /** * @description 抽象狀態(tài)角色 * @author zeling * @date 2018年1月14日 下午8:41:14 */ public interface State { /** * @description 處理方法 * @date 2018年1月14日 下午8:41:00 */ void handle(); }
package xyz.zeling.test.state.template; import xyz.zeling.test.state.template.base.State; /** * @description 具體狀態(tài)類A * @author zeling * @date 2018年1月14日 下午8:45:00 */ public class ConcreteStateA implements State { @Override public void handle() { // TODO Auto-generated method stub } }
package xyz.zeling.test.state.template; import xyz.zeling.test.state.template.base.State; /** * @description 具體狀態(tài)類A * @author zeling * @date 2018年1月14日 下午8:45:00 */ public class ConcreteStateB implements State { @Override public void handle() { // TODO Auto-generated method stub } }
package xyz.zeling.test.state.template; import xyz.zeling.test.state.template.base.State; /** * @description 具體狀態(tài)類A * @author zeling * @date 2018年1月14日 下午8:45:00 */ public class ConcreteStateC implements State { @Override public void handle() { // TODO Auto-generated method stub } }
package xyz.zeling.test.state.template; import xyz.zeling.test.state.template.base.State; /** * @description 狀態(tài)模式,環(huán)境角色類 * @author zeling * @date 2018年1月14日 下午8:43:58 */ public class Context { /** * 狀態(tài)對(duì)象 */ private State state; /** * @description 設(shè)置狀態(tài) * @date 2018年1月14日 下午9:13:20 * @param state 具體狀態(tài) */ public void setState(State state) { this.state = state; } /** * @description 執(zhí)行策略方法 * @date 2018年1月14日 下午8:43:31 */ public void request() { state.handle(); } }
實(shí)例應(yīng)用:橘子有不同顏色,狀態(tài)不同的橘子顏色不同,用狀態(tài)模式實(shí)現(xiàn)。
package xyz.zeling.test.state.demo.base; /** * @description 狀態(tài)模式,狀態(tài)接口 * @author zeling * @date 2018年1月14日 下午4:13:21 */ public interface Orange { /** * @description 輸出橘子的顏色 * @date 2018年1月14日 下午4:14:00 */ void printColor(); }
package xyz.zeling.test.state.demo; import xyz.zeling.test.state.demo.base.Orange; /** * @description 狀態(tài)2:青色的橘子 * @author zeling * @date 2018年1月14日 下午4:17:52 */ public class CyanOrange implements Orange { @Override public void printColor() { System.out.println("My color is cyan!"); } }
package xyz.zeling.test.state.demo; import xyz.zeling.test.state.demo.base.Orange; /** * @description 橘子狀態(tài)管理器 * @author zeling * @date 2018年1月14日 下午4:19:55 */ public class OrangeStateManage { /** * 橘子的狀態(tài) */ private Orange state; /** * @description 設(shè)置橘子的狀態(tài) * @date 2018年1月14日 下午4:21:36 * @param state */ public void setState(Orange state) { this.state = state; } /** * @description 輸出當(dāng)前狀態(tài)的橘子顏色 * @date 2018年1月14日 下午4:22:08 */ public void print() { state.printColor(); } }
package xyz.zeling.test.state.demo; import xyz.zeling.test.state.demo.base.Orange; /** * @description 狀態(tài)1:紅色外觀的橘子 * @author zeling * @date 2018年1月14日 下午4:15:29 */ public class RedOrange implements Orange { @Override public void printColor() { System.out.println("My color is red!"); } }
package xyz.zeling.test.state.demo; import xyz.zeling.test.state.demo.base.Orange; /** * @description 狀態(tài)3:黃色的橘子 * @author zeling * @date 2018年1月14日 下午4:18:45 */ public class YellowOrange implements Orange { @Override public void printColor() { System.out.println("My color is yellow!"); } }
客戶端
/** * @description 使用狀態(tài)模式:狀態(tài)模式,又稱狀態(tài)對(duì)象模式(Pattern of Objects for * States),狀態(tài)模式是對(duì)象的行為模式。狀態(tài)模式允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變其行為。這個(gè)對(duì)象看上去就像是改變了它的類一樣 * @date 2018年1月14日 下午4:04:16 */ public static void useState() { // 具體使用狀態(tài) Orange cyanOrange = new CyanOrange(); // 創(chuàng)建環(huán)境 OrangeStateManage orangeStateManage = new OrangeStateManage(); // 設(shè)置狀態(tài)并執(zhí)行 orangeStateManage.setState(cyanOrange); orangeStateManage.print(); }策略模式和狀態(tài)模式的比較
講真,我覺(jué)得它們都差不多啊,好難區(qū)別?。。?!
不過(guò),雖然講不出來(lái)它們的區(qū)別是什么,但是有個(gè)例子可以很好的描述它們的區(qū)別
demo狀態(tài)模式:這個(gè)模式就好比員工申請(qǐng)離職單的流程,離職單到直接上級(jí),這個(gè)狀態(tài)就是直接上級(jí)批示,等直接上級(jí)審閱之后,通過(guò)了就到下一個(gè)狀態(tài)。這一個(gè)個(gè)狀態(tài)對(duì)應(yīng)不同的處理,這是有順序要求的。
策略模式:這個(gè)模式好比于你假期要出國(guó)游玩,有日本、美國(guó)、新加坡等國(guó)家,你每到一個(gè)國(guó)家就執(zhí)行不同的游玩策略,可以先去日本,也可以先去美國(guó),沒(méi)有順序要求。
github地址:https://github.com/zeling1005...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70926.html
摘要:高質(zhì)量特性面向?qū)ο?,無(wú)類,原型可維護(hù)的代碼可讀一致可預(yù)測(cè)看起來(lái)像是同一個(gè)人寫(xiě)的文檔減少全局對(duì)象,傳參訪問(wèn)全局對(duì)象單模式,忘記時(shí)的副作用顯式聲明的全局變量無(wú)法用刪除不擴(kuò)充內(nèi)置原型模式每個(gè)和對(duì)齊這里不考慮花括號(hào)相關(guān)的縮進(jìn)規(guī)則每個(gè)中的代碼整齊縮進(jìn) 高質(zhì)量Javascript Javascript特性:面向?qū)ο?,無(wú)類,原型 可維護(hù)的代碼(可讀;一致;可預(yù)測(cè);看起來(lái)像是同一個(gè)人寫(xiě)的;文檔) 減...
摘要:說(shuō)明這篇文章是我第一次認(rèn)真閱讀阿里巴巴開(kāi)發(fā)手冊(cè)終極版的筆記。說(shuō)明本手冊(cè)明確防止是調(diào)用者的責(zé)任。一年半載后,那么單元測(cè)試幾乎處于廢棄狀態(tài)。好的單元測(cè)試能夠最大限度地規(guī)避線上故障。 說(shuō)明 這篇文章是我第一次(認(rèn)真)閱讀《阿里巴巴 Java 開(kāi)發(fā)手冊(cè)(終極版)》的筆記。手冊(cè)本身對(duì)規(guī)范的講解已經(jīng)非常詳細(xì)了,如果你已經(jīng)有一定的開(kāi)發(fā)經(jīng)驗(yàn)并且有良好的編碼習(xí)慣和意識(shí),會(huì)發(fā)現(xiàn)大部分規(guī)范是符合常識(shí)的。所以...
摘要:在重構(gòu)法則上,這種叫法則,衛(wèi)語(yǔ)句。在我們使用語(yǔ)句時(shí),判斷是否是錯(cuò)誤的情況出現(xiàn)嵌套,可以是用語(yǔ)句,讓失敗前置。 問(wèn)題:當(dāng)我們?cè)趯?xiě)業(yè)務(wù)邏輯時(shí)候,不知不覺(jué)已經(jīng)把代碼嵌套了好幾次: if (true){ if (true){ if (true){ for (){ ...
那有什么天生如此,只是我們天天堅(jiān)持。 本篇文章主要講解 《重構(gòu)---改善既有代碼的設(shè)計(jì)》 這本書(shū)中的 第九章簡(jiǎn)化條件表達(dá)式中 的知識(shí)點(diǎn), Decompose Conditional(分解條件表達(dá)式) 問(wèn)題:你有一個(gè)復(fù)雜的條件(if、then、else) 語(yǔ)句 解決:從if、then、else三個(gè)段落中分別提煉出獨(dú)立函數(shù) //重構(gòu)前 if (date.before(SUMMER_START) |...
閱讀 3745·2021-10-15 09:42
閱讀 2607·2021-09-03 10:50
閱讀 1654·2021-09-03 10:28
閱讀 1797·2019-08-30 15:54
閱讀 2520·2019-08-30 12:46
閱讀 415·2019-08-30 11:06
閱讀 2829·2019-08-30 10:54
閱讀 531·2019-08-29 12:59