策略模式(Strategy Pattern)在JAVA中的应用

ops/2024/12/22 0:42:59/

设计模式是软件工程中的一套被广泛认可的解决特定问题的最佳实践。它们是在多年的软件开发实践中总结出的有效方法。策略模式是JAVA中常用的一种行为型设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互换,让算法的变化独立于使用算法的客户。

 

## 1. 策略模式简介

 

策略模式的主要目的是定义一系列的算法,并将每一个算法封装起来,使它们可以互换。这样做的好处是算法可以独立于使用它的客户而变化。策略模式让算法的选择更加灵活,并且可以方便地扩展新的算法。

 

## 2. 模式的结构

 

策略模式主要包含以下几个角色:

 

- **上下文(Context)**:它是一个使用算法的角色,维护一个算法的引用。

- **抽象策略(Strategy)**:这是一个定义所有支持的算法的公共接口。

- **具体策略(Concrete Strategy)**:这些类实现了抽象策略定义的接口,并提供了具体的算法实现。

 

## 3. 模式的实现

 

以下是一个简单的JAVA示例,展示如何实现策略模式:

 

```java

// 抽象策略接口

public interface Strategy {

    public int doOperation(int num1, int num2);

}

 

// 具体策略A

public class StrategyA implements Strategy {

    @Override

    public int doOperation(int num1, int num2) {

        return num1 + num2;

    }

}

 

// 具体策略B

public class StrategyB implements Strategy {

    @Override

    public int doOperation(int num1, int num2) {

        return num1 - num2;

    }

}

 

// 具体策略C

public class StrategyC implements Strategy {

    @Override

    public int doOperation(int num1, int num2) {

        return num1 * num2;

    }

}

 

// 上下文

public class Context {

    private Strategy strategy;

 

    public Context(Strategy strategy) {

        this.strategy = strategy;

    }

 

    public int executeStrategy(int num1, int num2) {

        return strategy.doOperation(num1, num2);

    }

}

 

// 客户端代码

public class Client {

    public static void main(String[] args) {

        Context context = new Context(new StrategyA());

        System.out.println("Strategy A result: " + context.executeStrategy(10, 5));

 

        context = new Context(new StrategyB());

        System.out.println("Strategy B result: " + context.executeStrategy(10, 5));

 

        context = new Context(new StrategyC());

        System.out.println("Strategy C result: " + context.executeStrategy(10, 5));

    }

}

```

 

在这个例子中,`Strategy` 是一个抽象策略接口,`StrategyA`、`StrategyB` 和 `StrategyC` 是具体策略类,它们实现了 `Strategy` 接口并提供了具体的算法实现。

`Context` 是上下文类,它维护一个 `Strategy` 类型的成员变量,用于执行具体的策略。客户端代码演示了如何根据不同的策略创建上下文对象,并执行相应的算法。

 

## 4. 模式的优点

 

- **算法封装**:策略模式将算法封装起来,使算法可以独立于使用它的客户而变化。

- **扩展性**:策略模式让算法的变化更加容易,并且可以方便地扩展新的算法。

- **消除条件判断**:使用策略模式可以将一系列的条件判断转化为一系列策略类,代码更加清晰。

 

## 5. 模式的使用场景

 

- 当一个系统需要动态地在运行时选择算法时。

- 当一个类内部有多种解决相同问题的算法,并需要根据条件选择最佳方案时。

- 当需要消除大量相互关联的条件语句时。

 

## 6. 结语

 

策略模式是一种非常实用的设计模式,它通过定义一系列算法,并将每一个算法封装起来,使它们可以互换。在JAVA开发中,合理运用策略模式可以有效地提高代码的灵活性和可扩展性,使得算法的选择和管理变得更加简单和直观。然而,也应注意策略模式可能带来的问题,如策略类数量较多时可能导致系统复杂度增加等,因此在实际应用中需要根据具体情况谨慎使用。


http://www.ppmy.cn/ops/1832.html

相关文章

Elasticsearch:(二)3.集群的健康检查

1.健康状态 green:所有primary主分片和replica副分片均为active,集群健康。 yellow:至少一个replica副本分片不可用,但是所有primary主分片均为active,数据仍然是可以保证完整性的。 red:至少有一个primary为不可用状态,数据不…

uniapp 开发小程序如何检测到更新点击重启小程序完成更新?

官方文档:uni.getUpdateManager() | uni-app官网 示例代码: const updateManager uni.getUpdateManager();updateManager.onCheckForUpdate(function (res) {// 请求完新版本信息的回调console.log(res.hasUpdate); });updateManager.onUpdateReady(fu…

HTML5新增的多媒体标签

在网页中加入音乐 <audio></audio> src 设置音乐文件名以及路径,<audio>标记支持MP3、WAV及OGG 3种音乐格式 autoplay&#xff1a;是否自动播放,加入autopaly属性表示自动播放 controls&#xff1a; 是否显示播放面板,加入controls属性表示显示播放面板 …

比特币叙事大转向

作者&#xff1a;David Lawant 编译&#xff1a;秦晋 要理比特币解减半动态&#xff0c;最关键的图表是下面这张&#xff0c;而不是价格图表。它显示了自 2012 年以来&#xff0c;矿业总收入与比特币现货交易量的比例&#xff0c;并标注了三个减半日期。 虽然矿工仍然是比特币生…

租用境外服务器,越南服务器的优势有哪些

自从中国加入世界贸易组织之后&#xff0c;国内经济增加速度非常快&#xff0c;同时越来越多的人选择去东南亚国家发展&#xff0c;因为当地的中国人很多&#xff0c;所以中国企业在当地面临着更小的文化差异。东南亚地区也是最新的经济体&#xff0c;互联网正处于蓬勃发展的阶…

Matlab方程组拟合【案例源码+视频教程】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法&#xff0c;并提供所有案例完整源码&#xff1b;2.…

ElasticSearch(ES)语法关键词

文章目录 第一级关键词第二级关键词query使用highlight使用settings使用 第三级关键词boolanalysis使用 其他参考文档 第一级关键词 query&#xff1a;查询条件from&#xff1a;分页偏移量size&#xff1a;分页数量sort&#xff1a;排序_source&#xff1a;选择需要的字段aggs…

pytorch 今日小知识1——torch.set_printoptions

torch.set_printoptions torch.set_printoptions(precisionNone, thresholdNone, edgeitemsNone, linewidthNone, profileNone, sci_modeNone)这个方法是来修改pytorch中的打印选项的&#xff08;其实就是和numpy中更改打印方法一样&#xff09;&#xff0c;就是使用print打印…