设计模式学习——策略模式

一、介绍

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

策略模式应用的例子很多,比如最常见的Java类库中的 Comparator,它将对象的具体比较算法封装起来,我们可以根据所要比较的对象的类型自由选择。策略模式类图如下:

 

这个类图中右边是策略接口以及它的实现类,左边会有一个上下文,这个上下文会拥有一个策略,而具体这个策略是哪一种,我们是可以根据场景进行替换替换。

二、实现

接下来我们通过一段代码举例说明,下面的代码主要实现整数加减乘除计算的功能,我们将加、减、乘、除分别封装为四个策略,通过CalculateContext选择具体的策略进行计算。

首先是策略接口以及它的实现类。

public interface CalculateStrategy {
    int execute(int num1, int num2);
}

public class AddStrategy implements CalculateStrategy {

    @Override
    public int execute(int num1, int num2) {
        return num1 + num2;
    }
}

public class ReduceStrategy implements CalculateStrategy {

    @Override
    public int execute(int num1, int num2) {
        return num1 - num2;
    }
}

public class MultipiStrategy implements CalculateStrategy{
    @Override
    public int execute(int num1, int num2) {
        return num1 * num2;
    }
}

public class DivisionStrategy implements CalculateStrategy{
    @Override
    public int execute(int num1, int num2) {
        return num1 / num2;
    }
}

接着是Context类

public class CalculateContext {

    private CalculateStrategy calculateStrategy;

    public CalculateContext() {

    }

    public void setCalculateStrategy(CalculateStrategy calculateStrategy) {
        this.calculateStrategy = calculateStrategy;
    }

    public int execute(int num1, int num2) {
        return calculateStrategy.execute(num1, num2);
    }
}

最后我们使用client进行调用

public class Main {
    public static void main(String[] args)
    {
        CalculateContext calculateContext = new CalculateContext();
        calculateContext.setCalculateStrategy(new AddStrategy());
        calculateContext.execute(1, 2);

        calculateContext.setCalculateStrategy(new ReduceStrategy());
        calculateContext.execute(2, 1);

        calculateContext.setCalculateStrategy(new MultipiStrategy());
        calculateContext.execute(2, 2);

        calculateContext.setCalculateStrategy(new DivisionStrategy());
        calculateContext.execute(4, 2);
    }

 

posted @ 2021-05-18 23:32  阿拉懒神灯  阅读(82)  评论(0编辑  收藏  举报