设计模式【12】-- 搞定最近大火的策略模式 (2)

随机分配的时候,我们将每一份随机添加到红包里面去,但是这样不能保证每一份都有金额(注意这个不要在生产使用,仅限测试

import java.util.ArrayList; import java.util.List; import java.util.Random; public class RandomAllocateStrategy implements AllocateStrategy { @Override public List<Integer> allocate(RedPackage redPackage) { return ranRedPackage(redPackage.remainSize, redPackage.remainMoney); } public List<Integer> ranRedPackage(Integer count, Integer money) { List<Integer> result = new ArrayList<>(); for (int i = 0; i < count; i++) { result.add(0); } for (int i = 1; i <= money; i++) { int n = new Random().nextInt(count); result.set(n, result.get(n) + 1); } return result; } }

定义上下文类,封装不同的策略:

import java.util.List; public class Context { private AllocateStrategy strategy; public Context(AllocateStrategy strategy) { this.strategy = strategy; } public List<Integer> executeStrategy(RedPackage redPackage){ return strategy.allocate(redPackage); } }

测试类:

import java.util.List; public class Test { public static void main(String[] args) { RedPackage redPackage = new RedPackage(10,102); Context context = new Context(new RandomAllocateStrategy()); List<Integer> list =context.executeStrategy(redPackage); list.forEach(l-> System.out.print(l+" ")); System.out.println(""); context = new Context(new AverageAllocateStrategy()); list =context.executeStrategy(redPackage); list.forEach(l-> System.out.print(l+" ")); } }

可以看到分配的金额确实会随着策略类的不同发生不同的变化:

9 10 16 8 14 8 7 15 9 6 12 10 10 10 10 10 10 10 10 10

注意这个不能在生产使用!!!

优缺点

策略模式的优点:

消除if-else语句,不同策略相互隔离,方便维护

切换自由

拓展性好,实现接口即可

策略模式的缺点:

策略一旦数量过多,维护也会相对比较难,复用代码比较难

所有的策略类都对外暴露了,虽然一般通过Context上下文调用

策略模式比较常用,可能有些同学会混淆策略模式和状态模式:

相对于状态模式:策略模式只会执行一次方法,而状态模式会随着状态变化不停的执行状态变更方法。举个例子,我们从A地方去B地方,策略就是飞机或者火车,状态模式则是可能到某一个地方,换了一种交通方式,到另外一个地方又换了一种交通方式。

小结

策略模式比较常用,核心就是隔离不同的策略,将具体的算法封装在策略里面,抽象出一个策略抽象类,把不同具体策略类注入到上下文类中,达到选择不同策略的目的。

但是如果策略很多,需要考虑复用,策略类对外暴露的时候需要考虑滥用风险,会破坏封装性。

【作者简介】
秦怀,公众号【秦怀杂货店】作者,个人网站:,技术之路不在一时,山高水长,纵使缓慢,驰而不息。

设计模式系列:

设计模式【1】-- 单例模式到底几种写法?

设计模式【1.1】-- 你想如何破坏单例模式?

设计模式【1.2】-- 枚举式单例有那么好用么?

设计模式【1.3】-- 为什么饿汉式单例是线程安全的?

设计模式【2】-- 简单工厂模式了解一下?

设计模式【2.1】-- 简单工厂模式怎么演变成工厂方法模式?

设计模式【2.2】-- 工厂模式怎么演变成抽象工厂模式?

设计模式【3.1】-- 浅谈代理模式之静态、动态、cglib代理

设计模式【3.2】-- JDK动态代理源码分析有多香?

设计模式【3.3】-- CGLIB动态代理源码解读

设计模式【4】-- 建造者模式详解

设计模式【5】-- 原型模式

设计模式【6.1】-- 初探适配器模式

设计模式【6.2】-- 再聊聊适配器模式

设计模式【7】-- 探索一下桥接模式

设计模式【8】-- 手工耿教我写装饰器模式

设计模式【9】-- 外观模式?没那么高大上

设计模式【10】-- 顺便看看享元模式

设计模式【11】-- 搞定组合模式

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzpspx.html