设计模式学习之策略模式

设计模式学习之策略模式,第1张

1 策略模式的功能

策略模式的功能是把具体的算法实现,从具体的业务处理里面独立出来,实现成为单独的算法类,从而形成一系列的算法,并让这些算法可以相互替换。策略模式的重心不是如何实现算法,而是如何组织和调用这些算法,从而让程序的结构更灵活,具有更好的维护性和扩展性。

1.1 实现一个计算器

以菜鸟教程中的计算器示例代码为例,使用if-else实现和策略模式两种实现方式进行对比。本文的代码均使用Java语言编写。

1.1.1 使用if-else实现
package dp.strategy.example4;

public class Calculator {
    /**
     * 根据输入的参数和运算符做加减乘除运算,最简单的计算器不考虑异常情况
     * @param num1 输入运算数值1
     * @param num2 输入运算数值2
     * @param operation 预算符
     * @return 返回结果
     */
    public double doOperation(int num1, int num2, String operation) {
        if ("+".equals(operation)) {
            System.out.println(num1 + "+" + num2 + "=" + (num1 + num2));
            return num1 + num2;
        } else if ("-".equals(operation)) {
            System.out.println(num1 + "-" + num2 + "=" + (num1 - num2));
            return num1 - num2;
        } else if ("*".equals(operation)) {
            System.out.println(num1 + "*" + num2 + "=" + (num1 * num2));
            return num1 * num2;
        } else if ("/".equals(operation)) {
            System.out.println(num1 + "/" + num2 + "=" + (num1 / num2));
            return num1 / num2;
        }

        return 0;
    }
}

1.1.2 使用策略模式实现

使用策略模式实现的代码会稍微复杂一些,将计算逻辑和调用计算的代码解耦了,其类图为:

源代码:

package dp.strategy.example5;

// 创建接口
public interface CalculatorStrategy {
    public double doOperation(int num1, int num2);
}

// 创建实现接口的实现类,这里实现了加减乘三种运算
public class OperationAdd implements CalculatorStrategy{

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

public class OperationMultiply implements CalculatorStrategy{
    @Override
    public double doOperation(int num1, int num2) {
        return num1 * num2;
    }
}

public class OperationSubtract implements CalculatorStrategy{
    @Override
    public double doOperation(int num1, int num2) {
        return num1 - num2;
    }
}

// 创建上下文类用于调用具体的实现策略类
public class Context {
    private CalculatorStrategy calculatorStrategy;

    public Context(CalculatorStrategy strategy) {
        this.calculatorStrategy = strategy;
    }

    public double executeStrategy(int num1, int num2) {
        return calculatorStrategy.doOperation(num1, num2);
    }
}

// 创建一个用户(调用方)类,调用不同的实现策略类
public class CalculatorClient {
    public static void main(String[] args) {
        Context context = new Context(new OperationAdd());
        System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationSubtract());
        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationMultiply());
        System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
    }
}

2 策略模式和if-else写法的对比

每个具体的策略类实现的功能,就是原来的if-else结构中的具体实现。其实多个if-else语句表达的就是一个平等的结构,要么执行if、要么执行if-else中的某一个。而策略模式就是把各个平等的具体实现封装到了单独的策略实现类了,然后通过上下文来与具体的策略类进行交互。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/869202.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存