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

news/2024/12/1 20:36:08/

设计模式是软件工程中的一套被广泛认可的解决特定问题的最佳实践。它们是在多年的软件开发实践中总结出的有效方法。策略模式是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/news/1416229.html

相关文章

BUUCTF-Misc(1~4题)

一.签到 答案就在上面,输入:flag{buu-ctf} 二.金三胖 然后解压得到一个GIF图 大家清楚地看到闪过了两张红色的图片 方法一:使用GifSplitter 2.0 然后就可以在金三胖的文件夹里生成了每一帧的图片 可以看到答案是flag{he11ohongke} 方法二…

PostgreSQL入门到实战-第二十一弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(五)官网地址PostgreSQL概述PostgreSQL中RIGHT JOIN命令理论PostgreSQL中RIGHT JOIN命令实战更新计划 PostgreSQL中表连接操作(五) 使用PostgreSQL RIGHT JOIN连接两个表,并从右表返回行 官网地址 声明: 由于操作系统…

Js 的事件循环(Event Loop)机制

Js 的事件循环(Event Loop)机制 1、js是单线程的,会有阻塞问题 2、浏览器解决阻塞问题的方法:如网络请求、settimeout是用异步来做的,但异步任务没有优先级。为了更灵活,增加了事件循环 3、事件有同步任务和异步任务,先…

数据降维方法-主成分分析(PCA)

目录 一、前言 二、向量的表示及基变换 三、基变换 四、协方差矩阵 五、协方差 六、优化目标 一、前言 主成分分析(Principal Component Analysis) 用途:降维中的常用手段 目标:提取最有价值的信息(基于方差) 问题&#x…

【Vue】响应式原理与ref

首先讲讲JS中的Proxy JavaScript 运行环境包含了一些不可枚举、不可写入的对象属性,然而在 ES5 之前开发者无法定义他们自己的不可枚举属性或不可写入属性。ES5 引入 Object.defineProperty() 方法以便开发者在这方面能够像 JS 引擎那样做。 ES6 为了让开发者能进…

Linux:软硬链接及动静态库

一、Linux中的链接文件 1.1硬链接及应用场景 ln//创建硬链接 我们再创建一个硬链接生成的文件。 我们可以看到mlink.hard的inode和makefile.c的inode都是一样的,inode一样里面的数据自然也是一样。相当于对make.file进行了一个重命名,所以硬链接一定没…

python知识点汇总(十一)

python知识点总结 1、当Python退出时,是否会清除所有分配的内存?2、Python的优势有哪些?3、什么是元组的解封装4、Python中如何动态获取和设置对象的属性?5、创建删除操作系统上的文件6、主动抛出异常7、help() 函数和 dir() 函数…

鸿蒙OS开发学习:【第三方库调用】

介绍 本篇Codelab主要向开发者展示了在Stage模型中,如何调用已经上架到[三方库中心]的社区库和项目内创建的本地库。效果图如下: 相关概念 [Navigation]:一般作为Page页面的根容器,通过属性设置来展示页面的标题、工具栏、菜单。…