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

Java設(shè)計(jì)模式之策略模式詳解和示例

 更新時(shí)間:2024年01月18日 09:53:44   作者:小白不很白  
這篇文章主要介紹了Java設(shè)計(jì)模式之策略模式詳解和示例,策略模式就是一種行為可能會(huì)因?yàn)椴煌倪壿嬙斐啥鄠€(gè)算法,比如人吃飯,美國人吃飯用刀叉,中國吃飯用筷子,都是吃飯的行為但是使用的工具(算法)不一樣,需要的朋友可以參考下

1. 什么是策略模式

策略模式就是一種行為可能會(huì)因?yàn)椴煌倪壿嬙斐啥鄠€(gè)算法。比如人吃飯,美國人吃飯用刀叉,中國吃飯用筷子。都是吃飯的行為但是使用的工具(算法)不一樣。而策略行為就是把這寫工具封裝為對象,不同的人會(huì)動(dòng)態(tài)的調(diào)用不同的對象,來實(shí)現(xiàn)吃飯這一行為。 ?

2. 策略模式組成

環(huán)境類(Context):用一個(gè)ConcreteStrategy對象來配置。維護(hù)一個(gè)對Strategy對象的引用??啥x一個(gè)接口來讓Strategy訪問它的數(shù)據(jù)。

抽象策略類(Strategy):定義所有支持的算法的公共接口。 Context使用這個(gè)接口來調(diào)用某ConcreteStrategy定義的算法。

具體策略類(ConcreteStrategy):以Strategy接口實(shí)現(xiàn)某具體算法。

3. 策略模式UML圖

在這里插入圖片描述

4. 示例

就按照上面提到的例子,按照策略模式UML圖按照策略模式實(shí)現(xiàn)人吃飯這件事情。

4.1 創(chuàng)建Strategy抽象策略類

public interface Strategy {
    /**
     * 人類怎么吃飯的
     */
   public void eat();
}

4.2 創(chuàng)建環(huán)境類

public class Context {
    private Strategy strategy;
    public Context(){
    }
    public Context(Strategy strategy){
        this.strategy = strategy;
    }
    public void  setStrategy(Strategy strategy){
        this.strategy = strategy;
    }
    public void eat(){
        strategy.eat();
    }
}

上面環(huán)境類我根據(jù)我是實(shí)現(xiàn)了兩種方式傳入策略類,可以根據(jù)自己不同的需求就行靈活應(yīng)用給

4.3 創(chuàng)建實(shí)現(xiàn)

 
 /**
 * 美國人 吃飯
 */
@Component
public class StrategyImplOne implements Strategy{
    @Override
    public void eat() {
        System.out.println("美國人用刀叉吃飯");
    }
}
/**
 * 中國人 吃飯
 */
@Component
public class StrategyImplTwo implements Strategy{
    @Override
    public void eat() {
        System.out.println("中國人用筷子吃飯");
    }
}

4.4 測試

public class MainTest {
    public  static  void test(){
        Context context = new Context();
        context.setStrategy(new StrategyImplOne());
        context.eat();
        context.setStrategy(new StrategyImplTwo());
        context.eat();
    }
    public static void main(String[] args) {
        test();
    }
}

當(dāng)然了這是簡單的場景,在復(fù)雜的場景中我們不想經(jīng)過判斷他是美國人還是中國人來創(chuàng)建對應(yīng)的實(shí)現(xiàn),設(shè)置到環(huán)境類中,我們可以給每個(gè)實(shí)現(xiàn)設(shè)置一個(gè)屬性標(biāo)識(shí),來標(biāo)識(shí)他是中國人還是美國人,然后根據(jù)標(biāo)識(shí)通過反射創(chuàng)建對應(yīng)的實(shí)現(xiàn)對象,再設(shè)置到環(huán)境類中。下面我們看結(jié)果。 ?

首先我們加入一個(gè)枚舉類(enum) 用來存儲(chǔ)我們實(shí)現(xiàn)的策略類

public enum ManType {
    AMERICAN(1,"American",StrategyImplOne.class),
    CHINESE(1,"Chinese",StrategyImplTwo.class)
    ;
    private Integer code;
    private String type;
    private Class classModel;
    // 定義一個(gè)Map 開始的時(shí)候就把這信息存儲(chǔ)到這里面
    private static HashMap<String,Class> map = new HashMap<>(16);
    static {
        for ( ManType manType:ManType.values()) {
            map.put(manType.getType(),manType.getClassModel());
        }
    }
    ManType(Integer code, String type, Class classModel) {
        this.code = code;
        this.type = type;
        this.classModel = classModel;
    }
    public Integer getCode() {
        return code;
    }
    public String getType() {
        return type;
    }
    public Class getClassModel() {
        return classModel;
    }
    // 這個(gè)方法根據(jù)type獲取指定的類 通過反射來 創(chuàng)建對象
    public static Class getManType(String type){
        return map.get(type);
    }
}

創(chuàng)建好枚舉類后,我們的測試方法就變?yōu)橄旅娴倪@個(gè)樣子。寫的有點(diǎn)粗糙,大家見諒。 ?

public class MainTest {
    public   void test(String manType){
        Context context = new Context();
        try {
            Strategy strategy = (Strategy) (ManType.getManType(manType).newInstance());
            context.setStrategy(strategy);
            context.eat();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        new MainTest().test("American");
    }
}

其實(shí)也可以不用反射,如果項(xiàng)目是使用的是SpringBoot開發(fā)的話 我們可以把實(shí)現(xiàn)策略類在項(xiàng)目啟動(dòng)時(shí)就給通過@Component 給注冊到Spring容器中,然后通過ApplicationContext 從容器中獲取指定的對象。這樣也是可以的。

我就不一一展示了,感興趣的話可以自己在下面試一下。 ?

優(yōu)點(diǎn)和缺點(diǎn)

優(yōu)點(diǎn):

1、策略模式符合開閉原則。

2、避免使用多重條件轉(zhuǎn)移語句,如if…else…語句、switch 語句

3、使用策略模式可以提高算法的保密性和安全性。

缺點(diǎn)

1、客戶端必須知道所有的策略,并且自行決定使用哪一個(gè)策略類。

2、代碼中會(huì)產(chǎn)生非常多策略類,增加維護(hù)難度。

3、如果把策略類初始化時(shí)就放到Spring容器中,當(dāng)策略類太多事也是一種性能消耗。

到此這篇關(guān)于Java設(shè)計(jì)模式之策略模式詳解和示例的文章就介紹到這了,更多相關(guān)Java策略模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java面向?qū)ο笾^承、構(gòu)造方法、重寫、重載

    Java面向?qū)ο笾^承、構(gòu)造方法、重寫、重載

    本章具體介紹了什么是構(gòu)造方法、繼承、重寫、重載以及創(chuàng)建方法,整篇文章用老司機(jī)和人類來舉例,圖解穿插代碼案例,需要的朋友可以參考下
    2023-03-03
  • Java設(shè)計(jì)模式之原型模式的示例詳解

    Java設(shè)計(jì)模式之原型模式的示例詳解

    原型模式(Prototype Pattern)指使用原型實(shí)例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。本文將通過案例詳細(xì)講解一下原型模式,感興趣的可以了解一下
    2022-02-02
  • Spring?Boot?實(shí)現(xiàn)字段唯一校驗(yàn)功能(實(shí)例代碼)

    Spring?Boot?實(shí)現(xiàn)字段唯一校驗(yàn)功能(實(shí)例代碼)

    這篇文章主要介紹了Spring?Boot?實(shí)現(xiàn)字段唯一校驗(yàn),實(shí)現(xiàn)代碼很簡單,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • 詳解java JDK 動(dòng)態(tài)代理類分析(java.lang.reflect.Proxy)

    詳解java JDK 動(dòng)態(tài)代理類分析(java.lang.reflect.Proxy)

    這篇文章主要介紹了詳解java JDK 動(dòng)態(tài)代理類分析(java.lang.reflect.Proxy)的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • IDEA?報(bào)Plugin'maven-resources-plugin:'not?found?的解決方案

    IDEA?報(bào)Plugin'maven-resources-plugin:'not?found?

    如果在使用?IDEA?時(shí)遇到?"Plugin?'maven-resources-plugin:'?not?found"?錯(cuò)誤,可能是由于?Maven?倉庫中未找到所需的?Maven?插件,近小編給大家分享幾種解決方法,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • 使用Java實(shí)現(xiàn)獲取文件MD5值工具類

    使用Java實(shí)現(xiàn)獲取文件MD5值工具類

    我們在工作中通常使用MD5對文件進(jìn)行校驗(yàn)完整性,比較,提高安全性等,這篇文章主要為大家詳細(xì)介紹了Java如何編寫一個(gè)實(shí)現(xiàn)獲取文件MD5值的工具,需要的可以參考下
    2023-12-12
  • 使用SSE流式輸出實(shí)戰(zhàn)記錄(Javaweb前后端)

    使用SSE流式輸出實(shí)戰(zhàn)記錄(Javaweb前后端)

    這篇文章主要介紹了使用SSE流式輸出(Javaweb前后端)的相關(guān)資料,SSE是一種允許服務(wù)器向客戶端推送實(shí)時(shí)數(shù)據(jù)的技術(shù),適用于聊天應(yīng)用、實(shí)時(shí)數(shù)據(jù)監(jiān)控等場景,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-05-05
  • SpringBoot使用JavaMailSender實(shí)現(xiàn)發(fā)送郵件

    SpringBoot使用JavaMailSender實(shí)現(xiàn)發(fā)送郵件

    JavaMailSender是Spring Framework中的一個(gè)接口,用于發(fā)送電子郵件,本文主要為大家詳細(xì)介紹了SpringBoot如何使用JavaMailSender實(shí)現(xiàn)發(fā)送郵件,需要的可以參考下
    2023-12-12
  • mybatis項(xiàng)目實(shí)現(xiàn)動(dòng)態(tài)表名的三種方法

    mybatis項(xiàng)目實(shí)現(xiàn)動(dòng)態(tài)表名的三種方法

    有時(shí)在開發(fā)過程中java代碼中的表名和數(shù)據(jù)庫的表名并不是一致的,此時(shí)我們就需要?jiǎng)討B(tài)的設(shè)置表名,本文主要介紹了mybatis項(xiàng)目實(shí)現(xiàn)動(dòng)態(tài)表名的三種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • IDEA類和方法注釋模板設(shè)置全過程

    IDEA類和方法注釋模板設(shè)置全過程

    文章介紹了如何在IDEA中使用自定義的注釋模板,包括類注釋模板和方法注釋模板的設(shè)置方法,類注釋模板可以通過編輯File?and?Code?Templates來實(shí)現(xiàn),而方法注釋模板可以通過LiveTemplates功能創(chuàng)建
    2026-01-01

最新評論

上高县| 公安县| 武义县| 开鲁县| 深水埗区| 昆山市| 台北县| 镇江市| 瑞安市| 晴隆县| 麻城市| 固安县| 枣强县| 韩城市| 长宁区| 湟中县| 尉氏县| 双峰县| 松溪县| 木里| 海晏县| 吉木萨尔县| 台安县| 南投县| 久治县| 伊川县| 芜湖市| 任丘市| 讷河市| 尉犁县| 营山县| 沾益县| 靖州| 维西| 陇南市| 拜泉县| 阿城市| 朝阳区| 黔西县| 清流县| 东辽县|