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

Java?策略模式?if-else用法實例詳解

 更新時間:2022年07月05日 11:15:59   作者:??行百里er????  
這篇文章主要介紹了Java?策略模式?if-else用法詳解,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下

引言:

公司要擴大規(guī)模,目前需要購買一批汽車,還要招聘一批保安,老板指示暫時只想看新車,只需要給他看按照價格排好序的新車列表就行;保安候選人按照安保工作經驗排好序給他一個列表。

汽車數據,還有保安候選人的數據已經放在了程序員的面前,你只需要給我個列表就好了。

基于這個需求,我們自然而然的會想到排序啊。

開始之前,我們先來看一下jdk中的comparable接口comparator接口,可參考 文檔描述

策略模式

comparable接口

java.lang Interface Comparable

T - the type of objects that this object may be compared to(可以與之比較的對象的類型)

需要實現(xiàn)的方法:

int compareTo(T o)

參數:

o - 要比較的對象

返回:

當此對象小于指定的對象時返回負整數,等于返回0,大于返回正整數

我們寫Car類和SecurityMan類,讓他們都實現(xiàn)Comparable接口

汽車按價格排序:

public class Car implements Comparable<Car> {
    //價格
    private int price;
    //油箱容量
    private int capacity;
    public Car(int price, int capacity) {
        this.price = price;
        this.capacity = capacity;
    }
    @Override
    public int compareTo(Car c) {
        if (this.price < c.price) {
            return -1;
        }
        if (this.price > c.price) {
            return 1;
        }
        return 0;
    }
    @Override
    public String toString() {
        return "Car{" +
                "price=" + price +
                ", capacity=" + capacity +
                '}';
    }
}

保安按工作經驗排序:

public class SecurityMan implements Comparable<SecurityMan> {
    //安保經驗
    private int experience;
    //顏值
    private int beauty;

    public SecurityMan(int experience, int beauty) {
        this.experience = experience;
        this.beauty = beauty;
    }
    @Override
    public int compareTo(SecurityMan o) {
        if (this.experience < o.experience) {
            return -1;
        }
        if (this.experience > o.experience) {
            return 1;
        }
        return 0;
    }
    @Override
    public String toString() {
        return "SecurityMan{" +
                "experience=" + experience +
                ", beauty=" + beauty +
                '}';
    }
}

再來一個Context類,來封裝對那些對象進行比較的類

public class Context {
    public void sortCar(Car[] cars) {
        for (int i = 0; i < cars.length; i++) {
            int minIndex = i;
            for (int j = i + 1; j < cars.length; j++) {
                minIndex = cars[i].compareTo(cars[j]) > 0 ? j : minIndex;
            }
            Car c = cars[i];
            cars[i] = cars[minIndex];
            cars[minIndex] = c;
        }
    }
    public void sortSecurityMan(SecurityMan[] men) {
        for (int i = 0; i < men.length; i++) {
            int minIndex = i;
            for (int j = i + 1; j < men.length; j++) {
                minIndex = men[i].compareTo(men[j]) > 0 ? j : minIndex;
            }
            SecurityMan c = men[i];
            men[i] = men[minIndex];
            men[minIndex] = c;
        }
    }
}

那么問題來了,如果老板想要看汽車容量排序怎么辦?要看保安顏值排序怎么辦?

對于Car類,我們可以加一個屬性,比如sortBy,在compareTo方法中加if-else,根據sortBy的值進行不同的排序,而且Context類中也要加對應的方法。

這樣的話,后續(xù)如果你加更多的排序,就需要修改多處代碼,這酸爽。。。我如果想要對一個對象進行比較的策略能夠靈活的指定,這才是最好的?。?!

comparator接口

java.util Interface Comparator

T - the type of objects that may be compared by this comparator(比較器可以比較的對象類型)

方法:

int compare(T o1, T o2)

參數:

o1 - 第一個需要排序的對象

o2 - 第二個需要排序的對象

返回:

第一個需要排序的對象如果小于、等于、大于第二個對象,返回負整數,0,正整數

不同的排序策略實現(xiàn)

我們用Comparator接口來實現(xiàn)各種排序策略。

策略1:對汽車按照價格排序

public class CarPriceComparator implements Comparator<Car> {
    @Override
    public int compare(Car o1, Car o2) {
        if (o1.price < o2.price) return -1;
        else if (o1.price > o2.price) return 1;
        return 0;
    }
}

策略2:對汽車按照容量排序

public class CarCapacityComparator implements Comparator<Car> {
    @Override
    public int compare(Car o1, Car o2) {
        if (o1.capacity > o2.capacity) return -1;
        else if (o1.capacity < o2.capacity) return 1;
        return 0;
    }
}

策略3:對保安按照工作經驗排序

public class SecurityManExperienceComparator implements Comparator<SecurityMan> {
    @Override
    public int compare(SecurityMan o1, SecurityMan o2) {
        if (o1.experience < o2.experience) return -1;
        else if (o1.experience > o2.experience) return 1;
        return 0;
    }
}

策略4:對保安按照顏值排序

public class SecurityManBeautyComparator implements Comparator<SecurityMan> {
    @Override
    public int compare(SecurityMan o1, SecurityMan o2) {
        if (o1.beauty < o2.beauty) return -1;
        else if (o1.beauty > o2.beauty) return 1;
        return 0;
    }
}

這時我們的Context就可以為所欲為了,你想要對誰排序就可以對誰排序,只要你有相應的排序策略就可以。

Context策略切換上下文:

public class Context<T> {
    private Comparator comparator;
    public Context(Comparator comparator) {
        this.comparator = comparator;
    }
    public void sortWhatYouWant(T[] arr) {
        for (int i = 0; i < arr.length; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                minIndex = this.comparator.compare(arr[i], arr[j]) > 0 ? j : minIndex;
            }
            T o = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = o;
        }
    }
}

Client-相當于老板,老板想要什么排序策略,直接調起Context切換策略:

public class Client {

    public static void main(String[] args) {
        Car[] cars = {new Car(18, 55), new Car(12, 40), new Car(25, 60)};

        SecurityMan[] men = {new SecurityMan(10, 95), new SecurityMan(6, 92), new SecurityMan(8, 97)};

//        Context ctx = new Context(new CarCapacityComparator());
        Context ctx = new Context(new SecurityManBeautyComparator());
        ctx.sortWhatYouWant(men);
        System.out.println(Arrays.toString(men));
    }
}

這種寫法是不是比if-else逼格高了一些呢,^_^

這其實就是策略模式,他很好滴踐行了 對修改關閉,對擴展開放的設計原則。

總結一下,我們上面實現(xiàn)的策略模式類圖:

策略模式比if-else香在哪呢?有缺點嗎?

執(zhí)行方式可以自由切換:

比如我們上面舉的例子,可以對排序策略進行自由的切換。

執(zhí)行方式可以自由切換是策略模式本身定義的,只要實現(xiàn)抽象策略,它就成為策略家族的一個成員,通過封裝角色對其進行封裝,保證對外提供“可自由切換”的策略

避免使用多重條件判斷:

就我們的例子而言,兩個類,每個類都有可排序的兩個屬性,如果分別按照各自的屬性排序,得寫多少if-else啊?。?!

擴展性良好:

擴展性當然良好。一個具體的策略很好實現(xiàn)啊。

缺點其實顯而易見:

  • 1.策略類數量增多

每一個策略都是一個類,復用的可能性很小,類數量增多。

  • 2.所有的策略類都需要對外暴露

每有一個策略,都得告訴別人一下,否則老板也不知道你能不能給我滿足我的要求。

也就是說上層模塊必須知道有哪些策略,然后才能決定使用哪一個策略,那么我只是想使用了一個策略,我憑什么就要了解這個策略呢?那要你的封裝類還有什么意義?

策略模式有哪些使用場景呢?

  • 多個類只有在算法或行為上稍有不同的場景
  • 算法需要自由切換的場景

例如,算法的選擇是由使用者決定的,或者算法始終在進化,特別是一些站在技術前沿的行業(yè),連業(yè)務專家都無法給你保證這樣的系統(tǒng)規(guī)則能夠存在多長時間,在這種情況下策略模式是你最好的助手。

  • 需要屏蔽算法規(guī)則的場景

現(xiàn)在的科技發(fā)展得很快,人腦的記憶是有限的(就目前來說是有限的),太多的算法你只要知道一個名字就可以了,傳遞相關的數字進來,反饋一個運算結果,萬事大吉。

有N多個策略怎么辦?

如果系統(tǒng)中的一個策略家族的具體策略數量超過4個,則需要考慮使用混合模式,解決策略類膨脹和對外暴露的問題,否則日后的系統(tǒng)維護就會成為一個燙手山芋,誰都不想接。

針對策略模式的缺點,我們可以使用其他模式來修正這個缺陷,如工廠方法模式、代理模式或享元模式等。

總結

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

相關文章

  • 解決 IDEA 創(chuàng)建 Gradle 項目沒有src目錄問題

    解決 IDEA 創(chuàng)建 Gradle 項目沒有src目錄問題

    這篇文章主要介紹了解決 IDEA 創(chuàng)建 Gradle 項目沒有src目錄問題,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-06-06
  • Java簡單工廠模式詳細解釋

    Java簡單工廠模式詳細解釋

    本文主要介紹了JAVA簡單工廠模式(從現(xiàn)實生活角度理解代碼原理)的相關知識。具有很好的參考價值。下面跟著小編一起來看下吧
    2021-11-11
  • mybatis單筆批量保存實體數據的方法

    mybatis單筆批量保存實體數據的方法

    這篇文章主要介紹了mybatis單筆批量保存實體數據的相關知識,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 手把手教你使用Java實現(xiàn)在線生成pdf文檔

    手把手教你使用Java實現(xiàn)在線生成pdf文檔

    在實際的業(yè)務開發(fā)的時候,常常會需要把相關的數據信息,通過一些技術手段生成對應的PDF文件,然后返回給用戶。本文將手把手教大家如何利用Java實現(xiàn)在線生成pdf文檔,需要的可以參考一下
    2022-03-03
  • apache ant進行zip解壓縮操作示例分享

    apache ant進行zip解壓縮操作示例分享

    本文主要介紹了使用apache ant進行zip解壓縮操作的方法,可以解決中文編碼和首層父類無法創(chuàng)建問題,需要的朋友可以參考下
    2014-02-02
  • Java Kafka實現(xiàn)優(yōu)先級隊列的示例詳解

    Java Kafka實現(xiàn)優(yōu)先級隊列的示例詳解

    在分布式系統(tǒng)中,消息隊列是一種常見的異步通信機制,而優(yōu)先級隊列則是消息隊列的一種特殊形式,下面我們來看看如何利用Kafka實現(xiàn)優(yōu)先級隊列吧
    2025-03-03
  • Spring?Boot簡單實現(xiàn)文件上傳功能

    Spring?Boot簡單實現(xiàn)文件上傳功能

    這篇文章主要介紹了Spring?Boot簡單實現(xiàn)文件上傳功能,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • spring boot裝載自定義yml文件

    spring boot裝載自定義yml文件

    這篇文章主要為大家詳細介紹了spring boot裝載自定義yml文件的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Spring?Boot?調用外部接口的幾種方式

    Spring?Boot?調用外部接口的幾種方式

    在微服務架構中,服務間的調用是不可或缺的環(huán)節(jié),本文主要介紹了Spring?Boot調用外部接口的幾種方式,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • 利用java實現(xiàn)二維碼和背景圖的合并

    利用java實現(xiàn)二維碼和背景圖的合并

    本文介紹如何使用java代碼將自動生成的二維碼放入背景模板中,對于java學習者或許有幫助,一起來看看。
    2016-07-07

最新評論

改则县| 新津县| 龙胜| 涪陵区| 百色市| 石柱| 浦北县| 大悟县| 桃园县| 禹州市| 墨脱县| 阜南县| 雷山县| 烟台市| 甘肃省| 民乐县| 鄱阳县| 会理县| 特克斯县| 旬邑县| 固始县| 隆尧县| 六盘水市| 临汾市| 建德市| 驻马店市| 萨嘎县| 金秀| 陈巴尔虎旗| 荔波县| 米易县| 灌南县| 广平县| 长顺县| 九江县| 顺平县| 年辖:市辖区| 江陵县| 南京市| 府谷县| 黄平县|