最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?設計模式中的策略模式詳情

 更新時間:2022年09月25日 10:58:10   作者:我贏了算我輸  
這篇文章主要介紹了Java?設計模式中的策略模式詳情,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

策略模式的應用場景

策略模式是否要使用,取決于業(yè)務場景是否符合,有沒有必要。

是否符合

如果業(yè)務是處于不同的場景時,采取不同的處理方式的話,就滿足符合。 這里舉幾個業(yè)務栗子

如果今天我有1000塊,那我就和朋友去游樂園玩、然后再去吃頓好吃的。如果有2000塊的話,那我就先買一件好看的衣服,再和朋友去游樂園玩和吃好吃的商品收銀業(yè)務,根據(jù)店中不同的活動分為正常收費、折扣收費、返利收費,每種收費的方式都不一樣接收某安全設備的數(shù)據(jù)的時候,根據(jù)發(fā)過來不同的數(shù)據(jù)類型,執(zhí)行設備報警、設備指定信息存儲、設備本身狀態(tài)信息修改等等的處理方式

這里上面三種業(yè)務場景都符合處于不同的場景時,采取不同的處理方式

有沒有必要

這里等描述完例子后,再回到這個問題

例子

這里采用上面第三個例子的業(yè)務分別進行編寫不用策略模式和用策略模式的效果

不用策略模式

public class Main {
    public static void main(String[] args) {
        //設備報警
        int deviceDataType=2;
        DeviceData deviceData=new DeviceData();
        deviceData.setName("安全設備A");

        switch (deviceDataType){
            case 1:
                DeviceCallPolice(deviceData);
                break;
            case 2:
                DeviceStatus(deviceData);
                break;
            default:
                System.out.println("沒有相關的策略");
                break;
        }

    }
    private static void DeviceStatus(DeviceData deviceData) {
        System.out.println("正在修改"+deviceData.getName()+"狀態(tài)為指定狀態(tài)");
        System.out.println("正在記錄本次修改狀態(tài)的時間信息");
        System.out.println("根據(jù)修改后的狀態(tài)判斷是否要通知相關人");
    }
    private static void DeviceCallPolice(DeviceData deviceData) {
        System.out.println("正在修改"+deviceData.getName()+"狀態(tài)為報警狀態(tài)");
        System.out.println("正在記錄本次報警時間信息");
        System.out.println("設備相關人的短信通知");
    }

}

效果:

使用策略模式

策略上下文

/**
 * 
 * 安全設備處理上下文
 */
public class SafetyDeviceContext {

    private DeviceHandlerStrategy deviceHandlerStrategy;

    public SafetyDeviceContext(int dataType){
        switch (dataType){
            case 1:
                deviceHandlerStrategy=new DeviceCallPoliceStrategy();
                break;
            case 2:
                deviceHandlerStrategy=new DeviceStatusStrategy();
                break;
            default:
                System.out.println("沒有相關的策略");
                break;
        }

    }
    public void Handler(DeviceData deviceData){

        deviceHandlerStrategy.handler(deviceData);
    }
}

策略接口以及具體實現(xiàn)類

/**
 * 設備處理策略
 */
public interface DeviceHandlerStrategy {

    void handler(DeviceData deviceData);
}
/**
 * 安全設備報警策略
 */
public class DeviceCallPoliceStrategy implements DeviceHandlerStrategy {

    @Override
    public void handler(DeviceData deviceData) {

        System.out.println("正在修改設備狀態(tài)為報警狀態(tài)");
        System.out.println("正在記錄本次報警時間信息");
        System.out.println("設備相關人的短信通知");
    }
}
/**
 * 設備狀態(tài)修改策略
 */
public class DeviceStatusStrategy implements DeviceHandlerStrategy {

    @Override
    public void handler(DeviceData deviceData) {
        System.out.println("正在修改設備狀態(tài)為指定狀態(tài)");
        System.out.println("正在記錄本次修改狀態(tài)的時間信息");
        System.out.println("根據(jù)修改后的狀態(tài)判斷是否要通知相關人");
    }
}

Main類

public class Main {

    public static void main(String[] args) {
        //設備報警
        int deviceDataType=2;
        DeviceData deviceData=new DeviceData();
        deviceData.setName("安全設備A");
        SafetyDeviceContext safetyDeviceContext=new SafetyDeviceContext(deviceDataType);
        safetyDeviceContext.handler(deviceData);
    }
}

效果:

兩種方式的不同

從簡易和易懂程度來說,自然是不用策略模式好一些,用策略模式會導致類的增多,而且如果不懂策略模式的人去看代碼時可讀性不高。但使用策略模式勝于可擴展性和可維護性要強于不用策略模式的

使用策略模式在Main函數(shù)(使用方),消除了類型的swich判斷,把這些判斷放到了Context,使用方調用的時候,就不必過多關心設備處理策略,只需要把值傳進Context就好了。

之前我很不理解策略模式為什么能避免使用多重條件判斷,因為上面的寫法只是把判斷的代碼移到了Context而已,要寫的判斷還是要寫,直到我知道了采用字典和反射的方式時,就理解了,往下會說

  • 如果后續(xù)我們要添加一種"設備定時報告信息"業(yè)務處理方式時,使用策略模式那種只需要在Context添加一層case(也可以不需要,可以用反射的方式)和添加一個策略的實現(xiàn)類就好了,而不用策略模式需要在原來使用方的代碼添加一層case,可能會影響到原來的業(yè)務穩(wěn)定性。
  • 算法獨立出來也方便我們使用單元測試進行測試

策略模式有沒有必要使用?

策略模式的目的是減少具體的算法方式使用方式之間的耦合,避免多重if判斷,并讓具體的算法方法盡可能獨立。所以實現(xiàn)的時候,必然成本會高一些。因此我們要使用策略模式的時候,要確定該業(yè)務業(yè)務本身是否復雜,后續(xù)是不是會時不時添加其他的處理方式。
例如上面的第三個例子,設備對應的處理措施本身具備了復雜性,例如會涉及數(shù)據(jù)本身的處理、設備狀態(tài)的更改、設備事件的觸發(fā)等等處理措施,而且后續(xù)因業(yè)務的擴展,可能會添加不同的設備場景,不同的設備處理方式。像這種就可以考慮使用

如何避免Context類使用判斷邏輯

可以采用字典+反射的方式進行避免

定義策略字典的全局變量

/**
 * 設備處理策略方式字典
 */
public class DeviceStrategyDictionary {
    public static HashMap<Integer,String> dictionary=new HashMap<>();

}

修改Context的代碼

import java.util.HashMap;

/**
 * 安全設備處理上下文
 */
public class SafetyDeviceContext {

    private DeviceHandlerStrategy deviceHandlerStrategy;

    public SafetyDeviceContext(int dataType) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        HashMap<Integer,String> dic= DeviceStrategyDictionary.dictionary;
        if(!dic.containsKey(dataType)){
            System.out.println("不包含該處理方式");
        }
        //使用反射的方式
        Class<?> fz=Class.forName(dic.get(dataType));
        deviceHandlerStrategy=(DeviceHandlerStrategy) fz.newInstance();

    }
    public void handler(DeviceData deviceData){

        deviceHandlerStrategy.handler(deviceData);
    }
}

Main方法

public class Main {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

        //程序啟動的時候
        DeviceStrategyDictionary.dictionary.put(1,"DeviceCallPoliceStrategy");
        DeviceStrategyDictionary.dictionary.put(2,"DeviceStatusStrategy");

        //設備報警
        int deviceDataType=2;
        DeviceData deviceData=new DeviceData();
        deviceData.setName("安全設備A");

        SafetyDeviceContext safetyDeviceContext=new SafetyDeviceContext(deviceDataType);

        safetyDeviceContext.handler(deviceData);
    }

}

效果:

這樣就可以避免使用if判斷了,不過反射也有相關的性能消耗,這點也需要做權衡。

到此這篇關于Java 設計模式中的策略模式詳情的文章就介紹到這了,更多相關Java 策略模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

五峰| 云龙县| 朔州市| 吴堡县| 林芝县| 辽中县| 永泰县| 全南县| 英山县| 江陵县| 永丰县| 龙井市| 方正县| 曲周县| 读书| 墨竹工卡县| 内丘县| 徐水县| 务川| 平陆县| 屯昌县| 民县| 崇礼县| 石嘴山市| 新沂市| 堆龙德庆县| 博白县| 林口县| 两当县| 会理县| 高安市| 建平县| 兴义市| 青河县| 广南县| 正镶白旗| 错那县| 北安市| 全州县| 会东县| 青铜峡市|