便SpringSpring

Strategy接口有三个实现类,实现了接口的doOperation方法,不同的子类对该方法的实现逻辑不同,右边的Context类中有一个成员变量是Strategy类型;根据不同的策略为Context类中赋不同的Strategy的子类,就可以实现不同的逻辑了。以后如果需要新增加策略,就只要再加一个Strategy的实现类,再重写其doOperation,其它的策略不用改动。

不使用Spring的方式如何实现策略模式,网上有很多资料,请自行百度。下边看下结合Spring如何实现,直接上代码:

//先声明一个策略接口,所有的策略均实现该接口:public interface Strategy {    int doOperation(int num1, int num2);}
//加法的策略@Component("+")public class OperationAdd implements Strategy { @Override public int doOperation(int num1, int num2) { return num1 + num2; }}//除法的策略@Component("/")public class OperationDivision implements Strategy { @Override public int doOperation(int num1, int num2) { return num1 / num2; }}//乘法和策略@Component("*")public class OperationMultiply implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 * num2; }}

下边声明一个Context类,也可以声明一个工厂类,它们的作用是相似的:

@Componentpublic class Context {    @Autowired    private 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对象。

现在如果我们有了新的策略需要加入,怎么做呢?其实非常简单,只要再新加一个策略类就可以了:

//减法的策略@Component("-")public class OperationSubtract implements Strategy {    @Override    public int doOperation(int num1, int num2) {        return num1 - num2;    }}

下边是测试代码:

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = Config.class)public class TestCase {
@Autowired private Context context;
@Test public void testAdd() { int ans = context.executeStrategy("+", 2, 3);        System.out.println(ans);//输出:5 }
@Test public void testMultiply() { int ans = context.executeStrategy("*", 2, 3); System.out.println(ans);//输出:6 }
@Test public void testSubtract() { int ans = context.executeStrategy("-", 2, 3); System.out.println(ans);//输出:-1 }
@Test public void testDivision(){ int ans = context.executeStrategy("/", 2, 3); System.out.println(ans);//输出:0 }}

利用IOC将bean注入到一个Map中是一个非常实用的技巧,除此之外还可以注入到List和数组中,后边讲讲如何利用Spring来实现模板模式和责任链模式,都将用到这个技巧!

本篇文章来源于微信公众号: CHENG的学习笔记



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2023-06-27