一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java設計模式之java策略模式詳解

Java設計模式之java策略模式詳解

2022-01-03 17:51大忽悠愛忽悠 Java教程

這篇文章主要介紹了Java經典設計模式之策略模式,簡單說明了策略模式的概念、原理并結合實例形式分析了java策略模式的具有用法與相關注意事項,需要的朋友可以參考下

 

為什么使用策略模式?

實現某一個功能有多條途徑,每一條途徑對應一種算法,此時我們可以使用一種設計模式來實現靈活地選擇解決途徑,也能夠方便地增加新的解決途徑。

 

策略模式包含角色

  • Context(環境類):環境類是使用算法的角色,它在解決某個問題(即實現某個方法)時可以采用多種策略。在環境類中維持一個對抽象策略類的引用實例,用于定義所采用的策略。
  • Strategy(抽象策略類):它為所支持的算法聲明了抽象方法,是所有策略類的父類,它可以是抽象類或具體類,也可以是接口。環境類通過抽象策略類中聲明的方法在運行時調用具體策略類中實現的算法。
  • ConcreteStrategy(具體策略類):它實現了在抽象策略類中聲明的算法,在運行時,具體策略類將覆蓋在環境類中定義的抽象策略類對象,使用一種具體的算法實現某個業務處理。

 

策略模式的類圖

Java設計模式之java策略模式詳解

策略模式需要一個策略接口,不同的策略實現不同的實現類,在具體業務環境中僅持有該策略接口,根據不同的場景使用不同的實現類即可。

面向接口編程,而不是面向實現。

 

排序案例

對數組進行排序的算法有很多,但是不同的算法在不同的場景下可以發揮更大的效率,例如數據量很大的時候,我們可以使用快速排序,數據量小的時候就可以采用插入排序

Java設計模式之java策略模式詳解

抽象策略類

//抽象策略類
public  interface Strategy
{
    public void sort();
}

具體策略類

public class QuickSort implements Strategy
{
    @Override
    public void sort() {
        System.out.println("快速排序");
    }
}
public class InsertSort implements Strategy
{
    @Override
    public void sort() {
        System.out.println("插入排序");
    }
}
public class BubbleSort implements Strategy
{
    @Override
    public void sort() {
        System.out.println("冒泡排序");
    }
}

環境類

public class Context
{
    private  Strategy strategy;
    public void sort(int[] arr,Strategy strategy)
    {
        this.strategy=strategy;
        doSort();
    }
    private void doSort()
    {
        strategy.sort();
    }
}

測試類

public class Client
{
    public static void main(String[] args) {
        int[] arr={1,1,1,1,1,1,1,1,1,1};
        int[] arr1={1,1,1,1,1,1};
        int[] arr2={1,1,1};
        Context context=new Context();
        context.sort(arr,new QuickSort());
        context.sort(arr1,new InsertSort());
        context.sort(arr2,new BubbleSort());
    }
}

Java設計模式之java策略模式詳解

 

策略模式的優點

  • 策略模式提供了對 “開閉原則” 的完美支持,用戶可以在不修改原有系統的基礎上選擇算法或行為,也可以靈活地增加新的算法或行為。
  • 策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行為族,恰當使用繼承可以把公共的代碼移到抽象策略類中,從而避免重復的代碼。
  • 策略模式提供了一種可以替換繼承關系的辦法。如果不使用策略模式而是通過繼承,這樣算法的使用就 和算法本身混在一起,不符合 “單一職責原則”,而且使用繼承無法實現算法或行為在程序運行時的動態切 換。
  • 使用策略模式可以避免多重條件選擇語句。多重條件選擇語句是硬編碼,不易維護。
  • 策略模式提供了一種算法的復用機制,由于將算法單獨提取出來封裝在策略類中,因此不同的環境類可以方便地復用這些策略類。

 

策略模式的缺點

  • 客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區別,以便適時選擇恰當的算法。換言之,策略模式只適用于客戶端知道所有的算法或行為的情況。
  • 策略模式將造成系統產生很多具體策略類,任何細小的變化都將導致系統要增加一個新的具體策略類。
  • 無法同時在客戶端使用多個策略類,也就是說,在使用策略模式時,客戶端每次只能使用一個策略類,不支持使用一個策略類完成部分功能后再使用另一個策略類來完成剩余功能的情況。

 

適用場景

  • 一個系統需要動態地在幾種算法中選擇一種,那么可以將這些算法封裝到一個個的具體算法類中,而這些具體算法類都是一個抽象算法類的子類。換言之,這些具體算法類均有統一的接口,根據 “里氏代換原則” 和面向對象的多態性,客戶端可以選擇使用任何一個具體算法類,并只需要維持一個數據類型是抽象算法類的對象。
  • 一個對象有很多的行為,如果不用恰當的模式,這些行為就只好使用多重條件選擇語句來實現。此時,使用策略模式,把這些行為轉移到相應的具體策略類里面,就可以避免使用難以維護的多重條件選擇語句。
  • 不希望客戶端知道復雜的、與算法相關的數據結構,在具體策略類中封裝算法與相關的數據結構,可以提高算法的保密性與安全性。

 

源碼分析策略模式的典型應用

 

Java Comparator 中的策略模式

java.util.Comparator 接口是比較器接口,可以通過 Collections.sort(List,Comparator)Arrays.sort(Object[],Comparator) 對集合和數據進行排序,下面為示例程序

一個學生類,有兩個屬性 id 和 name

@Data
@AllArgsConstructor
public class Student {
    private Integer id;
    private String name;
    @Override
    public String toString() {
        return "{id=" + id + ", name="" + name + ""}";
    }
}

實現兩個比較器,比較器實現了 Comparator 接口,一個升序,一個降序

// 降序
public class DescSortor implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return o2.getId() - o1.getId();
    }
}
// 升序
public class AscSortor implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.getId() - o2.getId();
    }
}

通過 Arrays.sort() 對數組進行排序

public class Test1 {
    public static void main(String[] args) {
        Student[] students = {
                new Student(3, "張三"),
                new Student(1, "李四"),
                new Student(4, "王五"),
                new Student(2, "趙六")
        };
        toString(students, "排序前");
        Arrays.sort(students, new AscSortor());
        toString(students, "升序后");
        Arrays.sort(students, new DescSortor());
        toString(students, "降序后");
    }
    public static void toString(Student[] students, String desc){
        for (int i = 0; i < students.length; i++) {
            System.out.print(desc + ": " +students[i].toString() + ", ");
        }
        System.out.println();
    }
}

Java設計模式之java策略模式詳解

通過 Collections.sort() 對集合List進行排序

public class Client
{
    public static void main(String[] args) {
        List<Stu> students = Arrays.asList(
                new Stu(3, "張三"),
                new Stu(1, "李四"),
                new Stu(4, "王五"),
                new Stu(2, "趙六")
        );
        toString(students, "排序前");
        Collections.sort(students, new AscSortor());
        toString(students, "升序后");
        Collections.sort(students, new DescSortor());
        toString(students, "降序后");
    }
    public static void toString(List<Stu> students, String desc){
        for (Stu student : students) {
            System.out.print(desc + ": " + student.toString() + ", ");
        }
        System.out.println();
    }
}

Java設計模式之java策略模式詳解

我們向 Collections.sort()Arrays.sort() 分別傳入不同的比較器即可實現不同的排序效果(升序或降序)

這里 Comparator 接口充當了抽象策略角色,兩個比較器 DescSortor 和 AscSortor 則充當了具體策略角色,Collections 和 Arrays 則是環境角色

 

參考文章

策略模式

 

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/m0_53157173/article/details/120249370

延伸 · 閱讀

精彩推薦
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
主站蜘蛛池模板: 忘忧草在线| 精品久久免费视频 | 精品国产免费第一区二区三区日韩 | 性刺激欧美三级在线现看中文 | juliaann主妇疯狂| 日本高清在线不卡 | 久久无码人妻AV精品一区 | 亚洲美洲国产日产 | 久久精品亚洲热综合一本 | 久久视热频国产这里只有精品23 | japanese秘书丝袜 | 国产成人免费a在线资源 | 无码人妻精品一区二区蜜桃在线看 | 色综合久久九月婷婷色综合 | 免费视频精品一区二区 | 色网在线观看 | 色婷亚洲 | 狠狠色成人综合网图片区 | 激情视频在线播放 | 多人群p全肉小说 | 久9视频这里只有精品123 | 激情婷婷成人亚洲综合 | 美女和男生搞基 | 日韩毛片大全免费高清 | 国产在亚洲线视频观看 | 久久性综合亚洲精品电影网 | 久久九九久精品国产尤物 | 我把校花黑色蕾丝胸罩脱了 | 精品午夜久久网成年网 | www视频免费 | 日韩一区二三区无 | 色版网站| 小寡妇水真多好紧 | a片毛片在线免费看 | 国产清纯白嫩大学生正在播放 | 美女和男人免费网站视频 | 视频国产精品 | 免费在线看a | 息与子中文字幕完整在线 | 成人丁香乱小说 | 大团圆免费阅读全文 |