一、簡要描述
- Java 官方文檔
Overview (Java SE 18 & JDK 18)module indexhttps://docs.oracle.com/en/java/javase/18/docs/api/index.html
- Java中使用到的策略模式
Comparator、comparable
Comparator (Java SE 18 & JDK 18)declaration: module: java.base, package: java.util, interface: Comparatorhttps://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/util/Comparator.html
Comparable (Java SE 18 & JDK 18)declaration: module: java.base, package: java.lang, interface: Comparablehttps://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/lang/Comparable.html
二、主要設(shè)計思想
對更改關(guān)閉,對擴(kuò)展開放,程序更有彈性,可擴(kuò)展性強(qiáng)。
Extensibility、Scalability
對任意數(shù)據(jù)類型的數(shù)組進(jìn)行排序,且可以靈活的定義排序策略。
如:定義一個貓對象有高和重量兩個屬性,可以靈活根據(jù)貓對象的屬性策略進(jìn)行排序。
三、重新調(diào)整修改
1、定義支持泛型的Comparator比較器
/**
* @description: 比較器接口
* @author: flygo
* @time: 2022/7/4 16:26
*/
public interface Comparator<T> {
int compare(T o1, T o2);
}
2、調(diào)整Sorter排序類和方法
/**
* @description: 排序?qū)ο? * @author: flygo
* @time: 2022/7/4 11:16
*/
public class Sorter<T> {
public void sort(T[] arr, Comparator<T> comparator) {
for (int i = 0; i < arr.length - 1; i++) {
int minPos = i;
for (int j = i + 1; j < arr.length; j++) {
minPos = comparator.compare(arr[j], (arr[minPos])) == -1 ? j : minPos;
}
swap(arr, i, minPos);
}
}
void swap(T[] arr, int i, int j) {
T temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
3、定義貓高度的比較器
實(shí)現(xiàn)比較器
Comparator
接口中的compare
方法,按貓的高度進(jìn)行比較
/**
* @description: 貓按高比較
* @author: flygo
* @time: 2022/7/4 16:29
*/
public class CatHeightComparator implements Comparator<Cat> {
@Override
public int compare(Cat o1, Cat o2) {
if (o1.getHeight() < o2.getHeight()) return -1;
else if (o1.getHeight() > o2.getHeight()) return 1;
else return 0;
}
}
4、定義貓重量的比較器
/**
* @description: 貓按體重比較
* @author: flygo
* @time: 2022/7/4 16:29
*/
public class CatWeightComparator implements Comparator<Cat> {
@Override
public int compare(Cat o1, Cat o2) {
if (o1.getWeight() > o2.getWeight()) return -1;
else if (o1.getWeight() < o2.getWeight()) return 1;
else return 0;
}
}
5、主方法實(shí)現(xiàn)排序
最終實(shí)現(xiàn)效果:可以自定貓的排序策略,對貓數(shù)組進(jìn)行排序。
如排序策略:
CatHeightComparator
、CatWeightComparator
可以靈活根據(jù)策略進(jìn)行排序。
import java.util.Arrays;
/**
* @description: 主方法
* @author: flygo
* @time: 2022/7/4 11:15
*/
public class StrategyMain {
public static void main(String[] args) {
Cat[] arr = {new Cat(3, 3), new Cat(5, 5), new Cat(1, 1)};
Sorter sorter = new Sorter();
// CatHeightComparator comparator = new CatHeightComparator();
CatWeightComparator comparator = new CatWeightComparator();
sorter.sort(arr, comparator);
System.out.println(Arrays.toString(arr));
}
}
四、Lambda表達(dá)式寫法
Comparator接口只有一個方法,可以定義為函數(shù)式接口。如果默認(rèn)只有一個方法,
@FunctionalInterface
可以省略不寫。
1、Comparator 接口定義為 @FunctionalInterface
/**
* @description: 比較器接口
* @author: flygo
* @time: 2022/7/4 16:26
*/
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}
2、Lambda表達(dá)式調(diào)用方式
文章來源:http://www.zghlxwxcb.cn/news/detail-813301.html
import java.util.Arrays;
/**
* @description: 主方法
* @author: flygo
* @time: 2022/7/4 11:15
*/
public class StrategyMain {
public static void main(String[] args) {
method2();
}
private static void method2() {
Cat[] arr = {new Cat(3, 3), new Cat(5, 5), new Cat(1, 1)};
Sorter<Cat> sorter = new Sorter();
// CatHeightComparator comparator = new CatHeightComparator();
CatWeightComparator comparator = new CatWeightComparator();
sorter.sort(
arr,
(o1, o2) -> {
if (o1.getHeight() < o2.getHeight()) return -1;
else if (o1.getHeight() > o2.getHeight()) return 1;
else return 0;
});
System.out.println(Arrays.toString(arr));
}
}
五、源碼地址
GitHub - jxaufang168/Design-Patterns: 設(shè)計模式學(xué)習(xí)設(shè)計模式學(xué)習(xí). Contribute to jxaufang168/Design-Patterns development by creating an account on GitHub.https://github.com/jxaufang168/Design-Patterns文章來源地址http://www.zghlxwxcb.cn/news/detail-813301.html
到了這里,關(guān)于【設(shè)計模式-03】Strategy策略模式及應(yīng)用場景的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!