成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java重構(gòu)-策略模式、狀態(tài)模式、衛(wèi)語(yǔ)句

Sourcelink / 3011人閱讀

摘要:前言當(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-elseswitch語(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ū)別

狀態(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)有順序要求。

demo

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

相關(guān)文章

  • FE.BASE-前端設(shè)計(jì)模式、編碼與重構(gòu)筆記

    摘要:高質(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ě)的;文檔) 減...

    SmallBoyO 評(píng)論0 收藏0
  • 常識(shí)之外的規(guī)范——阿里java開(kāi)發(fā)手冊(cè)筆記(全章節(jié))

    摘要:說(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í)的。所以...

    Martin91 評(píng)論0 收藏0
  • 寫(xiě)通俗易懂代碼-用衛(wèi)語(yǔ)句替代嵌套條件表達(dá)式

    摘要:在重構(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 (){ ...

    tracy 評(píng)論0 收藏0
  • 重構(gòu)---改善既有代碼的設(shè)計(jì)》之簡(jiǎn)化條件表達(dá)式

    那有什么天生如此,只是我們天天堅(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) |...

    Cheng_Gang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<