栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式学习之策略模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式学习之策略模式

1 策略模式的功能

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

1.1 实现一个计算器

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

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

public class Calculator {
    
    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中的某一个。而策略模式就是把各个平等的具体实现封装到了单独的策略实现类了,然后通过上下文来与具体的策略类进行交互。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/854630.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号