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

Posted Ayato

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式学习——策略模式相关的知识,希望对你有一定的参考价值。

一、介绍

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

策略模式应用的例子很多,比如最常见的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);
    }

 

以上是关于设计模式学习——策略模式的主要内容,如果未能解决你的问题,请参考以下文章

策略模式学习三---总结

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

JAVA学习笔记--策略设计模式与适配器模式

设计模式之策略模式

策略模式——HeadFirst 设计模式学习笔记

设计模式学习心得(持续更新)