【设计模式】Strategy 策略模式

策略模式是什么?
策略是对算法的封装,是一种形为模式,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。

为什么要用?
优点:
1.扩展性良好;
2.避免使用多重条件判断,遵循开闭原则;
3.算法可以自由切换。
缺点:
1.所有策略类都需要对外暴露;
2.策略类会增多。

怎么用?
策略模式有以下几个概念:
Strategy接口:定义每个策略或算法必须具有的方法和属性。
ConcreteStrategy类:具体策略的实现;
Context类:上下文角色,有承上启下封装作用,负责和具体的策略实现交互。

下边直接上测试代码:

/**
 * @Description 定义抽象的策略角色
 * @date 2019/10/21 11:38
 * @Version V1.0
 */
public interface StrategyTest {
    /**
     * 定义两个数可以计算,实现简单的加减乘除的功能
     */
    int calc(int num1, int num2);
}
public class AddStrategyTest implements StrategyTest {
    /**
     * 实现calc方法,完成两个数相加
     */
    @Override
    public int calc(int num1, int num2) {
        return num1 + num2;
    }
}
public class SubtractStrategyTest implements StrategyTest {
    /**
     * 实现calc方法,完成两个数相减
     */
    @Override
    public int calc(int num1, int num2) {
        return num1 - num2;
    }
}
public class Context {
    // 持有对策略类的引用
    private StrategyTest strategyTest;
    
    public Context(StrategyTest strategyTest) {
        this.strategyTest = strategyTest;
    }
      public int calulate(int a, int b){
        return strategyTest.calc(a, b);
    }
}
@Test
public void strategyTest(){
    Context context = new Context(new AddStrategyTest());
    int calulate = context.calulate(20, 30);
    Context context1 = new Context(new SubtractStrategyTest());
    int calulate1 = context1.calulate(30, 20);
    System.out.println("----------------测试加法" + calulate + "--------------");
    System.out.println("----------------测试减法" + calulate1 + "--------------");
}

在这里插入图片描述
由上述结果可知,由于实例化不同的策略,所以最终在调用context.calulate();时,所获得的的结果就不尽相同。
策略模式是一种定义一些列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方法调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。这本身并没有解除客户端需要选择判断的压力,可以将策略模式和简单工厂模式结合,选择具体来实现的职责就可以给Context来承担,最大化地减轻了客户端的职责。

策略模式和简单工厂模式的区别:
简单工厂模式:只需要发出命令,由他人去实现。
策略模式:不知要发出命令,还得由自己亲自去做。
两个的区别非常微妙,Factory是直接创建详细的对象并用该对象去运行对应的动作,而Strategy将这个操作给了Context类。没有创建详细的对象,实现的代码的进一步封装。

发布了30 篇原创文章 · 获赞 12 · 访问量 3473

猜你喜欢

转载自blog.csdn.net/zx1293406/article/details/103399483