平时工作中,看过太多“祖传屎山”代码,平时也在有意总结,代码要怎么写才会更优雅、更方便扩展,要实现这些目标,设计模式无疑是要好好学习总结和利用的。网上讲设计模式的文章数不胜数,但是结合Spring来实现设计模式的文章却寥寥可数。接下来我利用几篇文章,来分享下我平时是如何利用Spring来实现常用的设计模式的。
今天先来讲,策略模式。
先看下策略模式的类图:

Strategy接口有三个实现类,实现了接口的doOperation方法,不同的子类对该方法的实现逻辑不同,右边的Context类中有一个成员变量是Strategy类型;根据不同的策略为Context类中赋不同的Strategy的子类,就可以实现不同的逻辑了。以后如果需要新增加策略,就只要再加一个Strategy的实现类,再重写其doOperation,其它的策略不用改动。
不使用Spring的方式如何实现策略模式,网上有很多资料,请自行百度。下边看下结合Spring如何实现,直接上代码:
//先声明一个策略接口,所有的策略均实现该接口:public interface Strategy {int doOperation(int num1, int num2);}//加法的策略("+")public class OperationAdd implements Strategy {public int doOperation(int num1, int num2) {return num1 + num2;}}//除法的策略("/")public class OperationDivision implements Strategy {public int doOperation(int num1, int num2) {return num1 / num2;}}//乘法和策略("*")public class OperationMultiply implements Strategy{public int doOperation(int num1, int num2) {return num1 * num2;}}
下边声明一个Context类,也可以声明一个工厂类,它们的作用是相似的:
@Componentpublic class Context {@Autowiredprivate Map<String, Strategy> strategyMap;public int executeStrategy(String operation, int num1, int num2) {return Optional.ofNullable(strategyMap).map(x -> x.get(operation)).map(x -> x.doOperation(num1, num2)).orElse(-1);}}
在这个Context类中,我们将所有Strategy的实现类全部注入到了一个Map中,这个是一个非常重要的技巧,其中Map的key是bean的名字,value是bean对象。
现在如果我们有了新的策略需要加入,怎么做呢?其实非常简单,只要再新加一个策略类就可以了:
//减法的策略("-")public class OperationSubtract implements Strategy {public int doOperation(int num1, int num2) {return num1 - num2;}}
下边是测试代码:
(SpringJUnit4ClassRunner.class)(classes = Config.class)public class TestCase {private Context context;public void testAdd() {int ans = context.executeStrategy("+", 2, 3);System.out.println(ans);//输出:5}public void testMultiply() {int ans = context.executeStrategy("*", 2, 3);System.out.println(ans);//输出:6}public void testSubtract() {int ans = context.executeStrategy("-", 2, 3);System.out.println(ans);//输出:-1}public void testDivision(){int ans = context.executeStrategy("/", 2, 3);System.out.println(ans);//输出:0}}
利用IOC将bean注入到一个Map中是一个非常实用的技巧,除此之外还可以注入到List和数组中,后边讲讲如何利用Spring来实现模板模式和责任链模式,都将用到这个技巧!
本篇文章来源于微信公众号: CHENG的学习笔记
微信扫描下方的二维码阅读本文

Comments NOTHING