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

Java設(shè)計模式之策略模式詳細(xì)解析

 更新時間:2023年11月30日 10:14:55   作者:啊幾  
這篇文章主要介紹了Java設(shè)計模式之策略模式詳細(xì)解析,策略模式中,定義算法族,分別封裝起來,讓他們之間可以相互轉(zhuǎn)化,此模式讓算法的變化獨立于使用算法的客戶,需要的朋友可以參考下

策略模式基本介紹

策略模式(Strategy Pattern)中,定義算法族,分別封裝起來,讓他們之間可以相互轉(zhuǎn)化,此模式讓算法的變化獨立于使用算法的客戶。

算法體現(xiàn)的設(shè)計原則:

  • 把變化的代碼從不變的代碼中分離出來
  • 針對接口編程而不是具體類(定義了策略接口)
  • 多用組合/聚合,少用繼承(通過使用組合方式使用策略模式)

策略模式實例

例如一個支付折扣服務(wù),根據(jù)會員的不同等級進行不同的折扣,初級會員打9折,中級會員打8折,高級會員打7折

會員接口

public interface Member {

    public void discount();
}

三個不同等級會員實現(xiàn)類

public class JuniorMember implements Member{
    @Override
    public void discount() {
        System.out.println("初級會員打9折");
    }
}
public class AssociateMember implements Member{
    @Override
    public void discount() {
        System.out.println("中級會員打8折");
    }
}
public class SeniorMember implements Member{
    @Override
    public void discount() {
        System.out.println("高級會員打7折");
    }
}

傳統(tǒng)模式

折扣服務(wù)類

public class DiscountService {
    Member member;
    public void payment(MemberType memberType){
        if(memberType==MemberType.JUNIOR){
            member = new JuniorMember();
            member.discount();
        }else if(memberType==MemberType.ASSOCIATE){
            member = new AssociateMember();
            member.discount();
        } else if (memberType==MemberType.SENIOR) {
            member = new SeniorMember();
            member.discount();
        }
    }
}

enum MemberType{
    ASSOCIATE,
    JUNIOR,
    SENIOR
}

客戶端類

public class Client {
    public static void main(String[] args){
        DiscountService discountService = new DiscountService();
        System.out.println("--------------使用傳統(tǒng)模式--------------");
        discountService.payment(MemberType.SENIOR);
        discountService.payment(MemberType.ASSOCIATE);
        discountService.payment(MemberType.JUNIOR);
    }
}
/**
 * --------------使用傳統(tǒng)模式--------------
 * 高級會員打7折
 * 中級會員打8折
 * 初級會員打9折
 */

雖然可以用if else 滿足需求,但是不滿足開閉原則(對擴展開放,對修改關(guān)閉),如果新增會員類型,或者下架原有會員類型,要對折扣服務(wù)類進行修改,擴展性很差??梢妭鹘y(tǒng)模式弊端十分大。

策略模式

折扣服務(wù)類

public class DiscountService {
    Member member;

    DiscountService(Member member){
        this.member = member;
    }

    public void setMember(Member member) {
        this.member = member;
    }

    public void payment(){
        member.discount();
    }
}

客戶端類

public class Client {
    public static void main(String[] args) {
        System.out.println("------------使用策略模式------------");
        DiscountService discountService = new DiscountService(new JuniorMember());
        discountService.payment();
        discountService.setMember(new AssociateMember());
        discountService.payment();
        discountService.setMember(new SeniorMember());
        discountService.payment();
    }
}
/**
 * ------------使用策略模式------------
 * 初級會員打9折
 * 中級會員打8折
 * 高級會員打7折
 */

這里將Menber策略接口作為參數(shù)組合到折扣服務(wù)類,不需要寫復(fù)雜的 if else,滿足開閉原則,增加新的會員類,折扣服務(wù)類也不需要修改,并且對其他會員折扣的業(yè)務(wù)邏輯不會造成影響

JDK中使用策略模式的例子

在JDK中Arrays類中,sort(T[] a, Comparator<? super T> c)方法就是使用了策略模式,Comparator就是一個策略接口,方法中傳入了一個具體的排序策略實現(xiàn)類,根據(jù)不同的排序策略,進行不同方式的排序

在這里插入圖片描述

使用場景

  • 如果在一個系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為。
  • 一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種。
  • 如果一個對象有很多的行為,如果不用恰當(dāng)?shù)哪J?,這些行為就只好使用多重的條件選擇語句來實現(xiàn)。

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

相關(guān)文章

  • java簡易文本分割器實現(xiàn)代碼

    java簡易文本分割器實現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了java簡易文本分割器的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 詳解SpringMVC中的日期處理和文件上傳操作

    詳解SpringMVC中的日期處理和文件上傳操作

    這篇文章主要為大家詳細(xì)介紹了SpringMVC中的日期處理和文件上傳操作方法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)有一定借鑒價值,需要的可以參考一下
    2022-08-08
  • Spring boot 應(yīng)用實現(xiàn)動態(tài)刷新配置詳解

    Spring boot 應(yīng)用實現(xiàn)動態(tài)刷新配置詳解

    這篇文章主要介紹了spring boot 配置動態(tài)刷新實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-09-09
  • SpringBoot 使用 Maven 打包方式

    SpringBoot 使用 Maven 打包方式

    maven打包有三種方式 pom、jar、war,本篇文章給大家介紹SpringBoot 使用 Maven 打包方式,結(jié)合實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • Java selenium上傳文件的實現(xiàn)

    Java selenium上傳文件的實現(xiàn)

    本文主要介紹了Java selenium上傳文件的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 關(guān)于RocketMQ使用事務(wù)消息

    關(guān)于RocketMQ使用事務(wù)消息

    RocketMQ是一種提供消息隊列服務(wù)的中間件,也稱為消息中間件,是一套提供了消息生產(chǎn)、存儲、消費全過程API的軟件系統(tǒng)。消息即數(shù)據(jù)。一般消息的體量不會很大,需要的朋友可以參考下
    2023-05-05
  • Mybatis-Plus實現(xiàn)SQL攔截器的示例

    Mybatis-Plus實現(xiàn)SQL攔截器的示例

    這篇文章主要介紹了Mybatis-Plus實現(xiàn)一個SQL攔截器,通過使用SQL攔截器,開發(fā)人員可以在執(zhí)行SQL語句之前或之后對其進行修改或記錄,從而更好地控制和優(yōu)化數(shù)據(jù)庫操作,對Mybatis-Plus?SQL攔截器相關(guān)知識感興趣的朋友一起看看吧
    2023-05-05
  • 使用棧的迷宮算法java版代碼

    使用棧的迷宮算法java版代碼

    這篇文章主要為大家詳細(xì)介紹了使用棧的迷宮算法java版代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java中的ArrayList.trimToSize()方法詳解

    Java中的ArrayList.trimToSize()方法詳解

    這篇文章主要介紹了Java中的ArrayList.trimToSize()方法詳解,前幾天看了Java?ArrayList,沒有明白trimToSize()這個方法是什么意思,所以看了一下源碼并且debug一下自己的一個例子,明白了其中的含義,需要的朋友可以參考下
    2023-11-11
  • 詳細(xì)聊一聊java語言中的package和import機制

    詳細(xì)聊一聊java語言中的package和import機制

    這篇文章主要給大家介紹了關(guān)于java語言中package和import機制的相關(guān)資料,Java中的package是指將相關(guān)的類組織在一起的一種機制,它可以用來避免命名沖突,也可以方便地管理和維護代碼,需要的朋友可以參考下
    2024-01-01

最新評論

永定县| 游戏| 根河市| 峨眉山市| 宁波市| 如皋市| 阜新| 徐闻县| 郯城县| 东乌| 岑溪市| 正镶白旗| 枣强县| 五常市| 泸水县| 嘉兴市| 司法| 博客| 新宾| 新兴县| 祁门县| 镇宁| 新干县| 天门市| 嫩江县| 余姚市| 翁源县| 湘潭县| 来宾市| 普兰县| 齐齐哈尔市| 德惠市| 西华县| 禹城市| 长宁区| 达拉特旗| 常山县| 木里| 永善县| 石首市| 吕梁市|