java 自定义策略_java 策略模式 jdk源码中的应用

策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换。此模式让算法的改变,不会影响到使用算法的客户端。

它对一系列的算法进行封装,为所有的算法定义一个抽象的接口,并通过继承该抽象算法接口对所有的算法加以封装和实现。具体的算法的选择交由客户端来决定(策略),策略模式主要用来平滑地处理算法的切换。

下面是形象的策略模式的结构图:

话不多说,看代码学的最快。先来看使用策略模式的简单demo。

public interface Strategy {

public double cost(int num);

}

public class StrategyA implements Strategy {

@Override

public double cost(int num) {

return num * 0.8;

}

}

public class StrategyB implements Strategy {

@Override

public double cost(int num) {

if (num > 100)

return 100 + 0.6 * (num - 100);

else {

return num * 0.9;

}

}

}

public class Context implements Strategy {

public Strategy strategy;

public Context(Strategy strategy) {

this.strategy = strategy;

}

public double cost(int num) {

return strategy.cost(num);

}

}

public class Test {

public static void main(String[] args) {

int num = 200;

Context context = new Context(new StrategyB());

double result = context.cost(num);

System.out.println("实际付账 " + result);

}

}

这是一个打折策略的demo。策略一:直接打8折。策略二:低于100打9折,高于100的话,高出100的那部分打6折。

然后我们来看结构:一个策略接口抽象打折策略。两个具体的策略类实现接口。一个维护了具体策略对象的类context。可参考下图进行形象理解。

当商家需要改变策略时就直接改变生成的策略算法就ok了。也就是说,它把策略和业务分割开了。你需要什么策略就生成什么策略就行了。然后把策略当作参数传进去就ok。

如果不使用策略模式,那么test函数就是这样写:

int num = 200;

Strategy strategy = new StrategyA();

double cost = strategy.cost(num);

System.out.println("实际付账 " + cost);

这样的话策略和业务逻辑就混在一起了,就显得结构不清晰。

然后我们来看看jdk源码中使用策略模式的地方。

1.

这里说的是ThreadPoolExecutor中的四种拒绝策略就是使用策略模式,大家可以详细看连接里面的图,清楚了解它的结构。

2.何柄融:学习红黑树1--treeset的初步使用​zhuanlan.zhihu.comzhihu-card-default.svg

这里讲了比较器comparator的使用,也就是可以用来进行各中对象的比较。常用的对象比如string和integer内部都通过实现comparable接口,自己定义了比较大小的策略。但是我们自定义的对象需要我们自己定义比较策略,所以comparator相当于就是自定义一种比较大小的策略。

3.集合中iterator的使用。

我们都知道collection集合中的数据结构都可以使用iterator进行遍历。可是每种数据结构都不同,遍历方式肯定不一样。所以每种数据结构都自定义了自己的遍历策略,然后你直接按照规则进行调用即可。大家可以自己去看看源码进行研究。

其实我不太懂这个策略模式,,,比如前面的策略模式的结构我就很难套进后面举例的jdk的策略模式里面。是不是有错误我也不太懂,但是已经有了基础的理解,就是一种对策略的封装和使用。以后有接触的话再从实际开发中再进行深入的理解。

这个链接里详细讲了策略模式的优缺点,然后我感觉这个需要实际的开发体验才能真正地深入理解这些优缺点,所以就不进行阐述了。

这篇文章就当作策略模式的入门吧。

欢迎交流和讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值