策略模式在jdk源码中的应用

关于策略模式的介绍可以参考上一篇博客:
https://blog.csdn.net/can_chen/article/details/106745298

策略模式的典型例子

设计一个网上书店,该系统中所有的计算机图书(ComputerBook),每本都有10%的折扣;所有的语言类图书(LanguageBook),每本有2元的折扣;小说类图书以每100元有10元的折扣,用策略模式设计该系统

模式类图:

策略模式在jdk源码中的应用_第1张图片

代码实现:
//策略接口
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);
	}
}
代码运行结果

策略模式在jdk源码中的应用_第2张图片
客户端还可以动态的改变计算图书价格的打折策略,只需要调用setBookStrategy方法即可!

策略模式在jdk源码中的应用

在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接口就是策略模式中的策略接口,它定义了一个排序算法,而具体的策略或者说具体的排序算法实现将由用户自定义实现。

  1. 不指定排序规则的情况:
//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]
}
  1. 自定义降序策略(匿名类的写法)
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]
}
  1. 自定义升序策略(Lambda表达式的写法)
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]
}

你可能感兴趣的:(设计模式,设计模式,java,策略模式,jdk源码)