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

关于策略模式的介绍可以参考上一篇博客:
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源码中的应用

在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]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值