关于策略模式的介绍可以参考上一篇博客:
https://blog.csdn.net/can_chen/article/details/106745298
设计一个网上书店,该系统中所有的计算机图书(ComputerBook),每本都有10%的折扣;所有的语言类图书(LanguageBook),每本有2元的折扣;小说类图书以每100元有10元的折扣,用策略模式设计该系统
//策略接口
public interface BookStrategy {
//提供计算图书价格的方法,不同的图书有不同的计算方法
double calcPrice(double price);
}
//具体的策略
public class ComputerBookStrategy implements BookStrategy{
@Override
public double calcPrice(double price) {
System.out.println("计算机类图书每本都有10%的折扣");
return price*0.9;
}
}
//具体的策略
public class LanguageBookStrategy implements BookStrategy{
@Override
public double calcPrice(double price) {
System.out.println("语言类图书每本都有2元的折扣");
return price-2.0;
}
}
//具体的策略
public class NovelBookStrategy implements BookStrategy{
@Override
public double calcPrice(double price) {
System.out.println("小说类图书每100元有10元的折扣");
int p=(int)price;
return price-(double)(p/100*10);
}
}
//计算价格的类
public class Price {
private BookStrategy bookStrategy;
public Price(BookStrategy bookStrategy) {
this.bookStrategy=bookStrategy;
}
public void setBookStrategy(BookStrategy bookStrategy) {
this.bookStrategy = bookStrategy;
}
public double sum(double price){
return this.bookStrategy.calcPrice(price);
}
}
public class Client {
public static void main(String[] args) {
double price=320.0;//假设商品原价是320.0元
double result;//折后价
//计算机类图书打折策略
System.out.println("========================计算机类图书打折策略=======================");
System.out.println("打折前的价格为:"+price);
result = new Price(new ComputerBookStrategy()).sum(price);
System.out.println("打折后的价格为:"+result);
//语言类图书打折策略
System.out.println("========================语言类图书打折策略=======================");
System.out.println("打折前的价格为:"+price);
result = new Price(new LanguageBookStrategy()).sum(price);
System.out.println("打折后的价格为:"+result);
//小说类图书打折策略
System.out.println("========================小说类图书打折策略=======================");
System.out.println("打折前的价格为:"+price);
result = new Price(new NovelBookStrategy()).sum(price);
System.out.println("打折后的价格为:"+result);
}
}
客户端还可以动态的改变计算图书价格的打折策略,只需要调用setBookStrategy方法即可!
在JDK中,我们调用数组工具类Arrays的一个排序方法sort时,可以使用默认的排序规则(升序),也可以自定义指定排序的规则,也就是可以自定义实现升序排序还是降序排序,方法的源码如下:
public static <T> void sort(T[] a, Comparator<? super T> c) {
if (c == null) {
sort(a);//若没有传入Comparator接口的实现类对象,也就是调用默认的排序方法
} else {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, c);
else
TimSort.sort(a, 0, a.length, c, null, 0, 0);
}
}
也就是说我们传递两个参数,一个是待排序的数组,另一个是Comparator接口的实现类对象,其中Comparator接口是一个函数式接口,接口里面定义了一个用于定义排序规则的抽象方法int compare(T o1, T o2);
,由此可见,Comparator接口就是策略模式中的策略接口,它定义了一个排序算法,而具体的策略或者说具体的排序算法实现将由用户自定义实现。
//Arrays的sort方法默认是进行升序排序
public static void main(String[] args) {
int[] arr={
10,11,9,-7,6,18,2};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));//[-7, 2, 6, 9, 10, 11, 18]
}
public static void main(String[] args) {
//使用匿名类的写法
Comparator<Integer> c=new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if(o1>o2){
return -1;
}else if(o1<o2){
return 1;
}else{
return 0;
}
}
};
Integer[] arr={
10,11,9,-7,6,18,2};
Arrays.sort(arr, c);
System.out.println(Arrays.toString(arr));//[18, 11, 10, 9, 6, 2, -7]
}
public static void main(String[] args) {
//由于Comparator接口是函数式接口,可以使用Lambda表达式进行简化
Integer[] arr={
10,11,9,-7,6,18,2};
Arrays.sort(arr, (o1,o2)->{
if(o1>o2){
return 1;
}else if(o1<o2){
return -1;
}else{
return 0;
}
});
System.out.println(Arrays.toString(arr));//[-7, 2, 6, 9, 10, 11, 18]
}