設計模式之--策略模式及其在JDK中的應用
前言:本文主要介紹設計模式中的策略模式,準備按照以下幾個方面展開:
- 什麼是策略模式
- 策略模式結構和UML圖
- 策略模式在JDK中的應用
一、什麼是策略模式以及策略模式功能
1.1 為什麼需要策略模式?
1)完成一項任務,往往可以有多種不同的方式,每一種方式稱為一個策略,我們可以根據環境或者條件的不同選擇不同的策略來完成該項任務。
2)在軟體系統中,很多演算法可以實現某一功能,比如查詢、排序。這裡以查詢演算法為例說明,如果我們需要提供多種查詢演算法,可以將這些演算法寫在一個類中,在該類中提供多個方法,每一個方法對應一個具體的查詢演算法;當然也可以將這些查詢演算法封裝在一個統一的方法中,通過if…else…等條件判斷語句來進行選擇。但是這兩種實現方式有個弊端,如果需要增加一種新的查詢演算法,需要修改封裝演算法類的原始碼;更換查詢演算法,也需要修改客戶端呼叫程式碼。維護起來比較困難。
3)除了提供專門的查詢演算法類之外,還可以在客戶端程式中直接包含演算法程式碼,這種做法更不可取,將導致客戶端程式龐大而且難以維護,如果存在大量可供選擇的演算法時問題將變得更加嚴重。(這裡的在客戶端中包含演算法程式碼的意思就好比我們在包含main函式的類裡去實現演算法,而不專門提供封裝演算法的類)
4)為了解決這些問題,可以定義一些獨立的類來封裝不同的演算法,每一個類封裝一個具體的演算法,在這裡,每一個封裝演算法的類我們都可以稱之為策略(Strategy),為了保證這些策略的一致性,一般會用一個抽象的策略類來做演算法的定義,而具體每種演算法則對應於一個具體策略類。
1.2 什麼是策略模式?
策略模式(Strategy Pattern):定義一系列演算法,將每一個演算法封裝起來,並讓它們可以相互替換。策略模式讓演算法獨立於使用它的客戶而變化。
二、策略模式結構和UML圖
2.1 策略模式結構
策略模式包含如下角色:
- Context: 環境類
- Strategy: 抽象策略類
- ConcreteStrategy: 具體策略類
其中Context類持有Strategy的引用,ConcreteStrategy實現Strategy介面。
2.2 策略模式UML圖
2.3 策略模式Demo
以上面說的排序演算法的選擇為例,寫一個Demo。
首先定義抽象策略類AbstractSort
public interface AbstractSort {
void sort();
}
然後定義具體策略類ConcreteSort1
,ConcreteSort2
,ConcreteSort3
public class ConcreteSort1 implements AbstractSort {
@Override
public void sort() {
System.out.println("使用快速排序");
}
}
public class ConcreteSort2 implements AbstractSort {
@Override
public void sort() {
System.out.println("使用歸併排序");
}
}
public class ConcreteSort3 implements AbstractSort {
@Override
public void sort() {
System.out.println("使用堆排序");
}
}
接著定義Context
環境類
public class Context {
public AbstractSort method;
public Context(AbstractSort abstractSort) {
this.method = abstractSort;
}
public void contextSort() {
method.sort();
}
}
最後定義客戶端類Main
public class Main {
public static void main(String[] args) {
//傳入不同的具體策略即可
Context context = new Context(new ConcreteSort2());
context.contextSort();
}
}
三、策略模式在JDK中的應用
3.1 比較器Comparator
在Java的集合框架中,經常需要通過構造方法傳入一個比較器Comparator,或者建立比較器傳入Collections的靜態方法中作為方法引數,進行比較排序等,使用的是策略模式。
在該比較架構中,Comparator就是一個抽象的策略;一個類實現該結構,並實現裡面的compare方法,該類成為具體策略類;Collections類就是環境角色,他將集合的比較封裝成靜態方法對外提供api。
3.2 ThreadPoolExecutor中的四種拒絕策略
在建立執行緒池時,需要傳入拒絕策略,當建立新執行緒使當前執行的執行緒數超過maximumPoolSize時,將會使用傳入的拒絕策略進行處理。
- AbortPolicy:直接丟擲異常。
- CallerRunsPolicy:只用呼叫者所線上程來執行任務。
- DiscardOldestPolicy:丟棄佇列裡最近的一個任務,並執行當前任務。
- DiscardPolicy:不處理,丟棄掉。
這裡使用的就是策略模式。
相關文章
- 設計模式在 TypeScript 中的應用 – 策略模式設計模式TypeScript
- 設計模式 - 命令模式詳解及其在JdbcTemplate中的應用設計模式JDBC
- 設計模式 - 迭代器模式詳解及其在ArrayList中的應用設計模式
- 【技巧篇】JavaScript設計模式之策略模式應用JavaScript設計模式
- 設計模式及其在spring中的應用(含程式碼)設計模式Spring
- 設計模式 | 策略模式及典型應用設計模式
- 設計模式之Decorator在餐館中的應用設計模式
- 設計模式學習筆記(十六)迭代器模式及其在Java 容器中的應用設計模式筆記Java
- 設計模式之策略模式設計模式
- 設計模式之【策略模式】設計模式
- 【設計模式之策略模式】設計模式
- 策略模式在應用中的實踐模式
- 【設計模式】漢堡中的設計模式——策略模式設計模式
- 設計模式在vue中的應用(六)設計模式Vue
- 設計模式在vue中的應用(七)設計模式Vue
- 設計模式在vue中的應用(五)設計模式Vue
- 設計模式在vue中的應用(三)設計模式Vue
- 設計模式在vue中的應用(四)設計模式Vue
- 設計模式在vue中的應用(一)設計模式Vue
- 設計模式在vue中的應用(二)設計模式Vue
- 設計模式,及在Java中的應用設計模式Java
- PHP 設計模式之策略模式PHP設計模式
- JavaScript 設計模式之策略模式JavaScript設計模式
- Javascript設計模式之策略模式JavaScript設計模式
- JAVA設計模式之策略模式Java設計模式
- 略懂設計模式之策略模式設計模式
- 設計模式系列之「策略模式」設計模式
- Python 中的設計模式詳解之:策略模式Python設計模式
- 策略模式在實際業務中的應用模式
- 策略模式在業務中的實際應用模式
- 設計模式學習筆記(十三)組合模式及其在樹形結構中的應用設計模式筆記
- 設計模式(三)Animation中的策略模式設計模式
- python設計模式之策略模式Python設計模式
- 設計模式漫談之策略模式設計模式
- Java設計模式之策略模式示例Java設計模式
- Java設計模式之(十四)——策略模式Java設計模式
- javascript設計模式 之 2 策略模式JavaScript設計模式
- Java設計模式之策略模式(Strategy)Java設計模式