金三银四面试题(二十五):策略模式知多少?

什么是策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,旨在定义一系列算法,将每个算法封装到一个独立的类中,使它们可以互换。策略模式让算法的变化独立于使用它们的客户端,使得客户端可以根据需要动态地选择不同的策略。

策略模式的特点

  1. 策略的定义:在策略模式中,算法被定义为一组策略,每个策略都封装在一个独立的类中。策略类通常实现一个公共接口,以便客户端可以根据需要使用不同的策略。

  2. 客户端使用策略:客户端通过组合策略对象来使用特定的策略。客户端不需要知道具体策略的实现细节,只需要知道如何使用策略接口。

  3. 动态切换策略:策略模式允许客户端在运行时动态切换策略。这使得客户端可以根据不同的场景或条件选择不同的策略。

  4. 封装:策略模式将算法封装在独立的类中,这样算法的变化不会影响客户端的代码。客户端只需要依赖策略接口,而不是具体的策略实现。

应用场景

  • 需要定义一组算法,并且这些算法之间可以互换。
  • 客户端需要根据不同的条件动态选择不同的策略。
  • 希望将算法的变化独立于使用它们的客户端代码。

优点

  • 开放封闭原则:可以根据需要添加新的策略,而无需修改现有代码。
  • 代码复用:多个客户端可以共享相同的策略。
  • 灵活性:客户端可以在运行时动态切换策略。

缺点

  • 策略类数量增加:每个策略都需要独立的类,这可能导致类的数量增加。
  • 客户端需要了解所有策略:客户端需要知道所有可用的策略,以便选择合适的策略。

举个例子

下面是一个示例程序,展示了策略模式在排序算法中的应用。程序中定义了一个排序策略接口,并实现了两种排序策略:冒泡排序和快速排序。客户端可以根据需要动态选择不同的排序策略。

// 排序策略接口
interface SortStrategy {void sort(int[] array);
}// 冒泡排序策略
class BubbleSortStrategy implements SortStrategy {@Overridepublic void sort(int[] array) {System.out.println("Sorting using Bubble Sort");for (int i = 0; i < array.length - 1; i++) {for (int j = 0; j < array.length - i - 1; j++) {if (array[j] > array[j + 1]) {// 交换元素int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;}}}}
}// 快速排序策略
class QuickSortStrategy implements SortStrategy {@Overridepublic void sort(int[] array) {System.out.println("Sorting using Quick Sort");quickSort(array, 0, array.length - 1);}private void quickSort(int[] array, int low, int high) {if (low < high) {int pi = partition(array, low, high);quickSort(array, low, pi - 1);quickSort(array, pi + 1, high);}}private int partition(int[] array, int low, int high) {int pivot = array[high];int i = low - 1;for (int j = low; j < high; j++) {if (array[j] <= pivot) {i++;int temp = array[i];array[i] = array[j];array[j] = temp;}}int temp = array[i + 1];array[i + 1] = array[high];array[high] = temp;return i + 1;}
}// 上下文类,负责使用排序策略
class SortContext {private SortStrategy strategy;// 设置排序策略public void setStrategy(SortStrategy strategy) {this.strategy = strategy;}// 使用当前的排序策略对数组进行排序public void sortArray(int[] array) {strategy.sort(array);}
}// 客户端代码
public class StrategyPatternDemo {public static void main(String[] args) {// 创建排序上下文SortContext context = new SortContext();// 设置冒泡排序策略context.setStrategy(new BubbleSortStrategy());int[] array1 = {5, 2, 9, 1, 5, 6};context.sortArray(array1);System.out.println("Sorted array using Bubble Sort: " + java.util.Arrays.toString(array1));// 设置快速排序策略context.setStrategy(new QuickSortStrategy());int[] array2 = {5, 2, 9, 1, 5, 6};context.sortArray(array2);System.out.println("Sorted array using Quick Sort: " + java.util.Arrays.toString(array2));}
}

在这个示例中,SortStrategy 是排序策略的接口,定义了一个 sort 方法。BubbleSortStrategyQuickSortStrategy 是两个具体的排序策略类,实现了 SortStrategy 接口。客户端通过创建 SortContext 对象并设置排序策略,来对数组进行排序。在运行时,客户端可以根据需要动态选择不同的排序策略。

总结

策略模式通过定义一系列策略,将每个策略封装成独立的类,使得客户端可以根据需求动态切换不同的策略,提高代码的灵活性和可维护性。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/669694.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ACM出版】第四届控制与智能机器人国际学术会议(ICCIR 2024)

第四届控制与智能机器人国际学术会议&#xff08;ICCIR 2024&#xff09; 2024 4th International Conference on Control and Intelligent Robotics 2024年6月21日-23日 | 中国-广州 官网&#xff1a;www.ic-cir.org EI、Scopus双检索 投稿免费参会、口头汇报及海报展示 四…

【数据库】MySQL安装与卸载

文章目录 [toc]MySQL下载网盘链接下载网址 MySQL安装解压生成data文件安装MySQL启动MySQL服务 MySQL登录设置root用户密码 环境变量配置MySQL卸载 个人主页&#xff1a;丷从心 系列专栏&#xff1a;MySQL 学习指南&#xff1a;数据库 MySQL下载 网盘链接 链接&#xff1a;h…

7-35 有理数均值

题目链接&#xff1a;7-35 有理数均值 一. 题目 1. 题目 2. 输入输出样例 3. 限制 二、代码 1. 代码实现 #include <iostream> using namespace std;// 计算公约数 int calGcd(int a, int b) {int gcd;bool negative false;if (a a / b * b) { // b整除areturn b;}…

C++(程序的内存分区)

程序的内存分区模型 C程序在执行时&#xff0c;将内存划分为4个区域 1.代码区&#xff1a;存放函数的二进制代码&#xff0c;由操作系统进行管理 2.全局区&#xff1a;存放全局变量和静态变量以及常量 3.栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值&…

通过Nginx转发admin连接licloud-api-develop接口

1.需求配置 在本地环境部署一套开发环境&#xff0c;方便开发金磊调试功能 所使用到的服务有nginx&#xff0c;mysql&#xff0c;rabbitmq&#xff0c;redis&#xff0c;docker 服务安装网上都有教程这里就不一一列举出来了&#xff0c;服务都配置好之后 开始组建开发环境 2…

图像处理(二)

图像处理&#xff08;2&#xff09; 裁剪图片 from skimage import io,dataiimg io.imread(rD:\工坊\图像处理\十个勤天2.png)roiiimg[50:150,120:200,:]io.imshow(roi) 运行结果&#xff1a; 将图片进行二值化 from skimage import io,data,colorimg io.imread(r"…

数据分析:转录本ID和基因ID转换

前言 在使用kallisto等基于cDNA数据库注释软件时&#xff0c;获得的gene expression matrix的gene id是transcript id。后续在做数据分析时&#xff0c;需要将其转换成gene symbol。以下介绍两种转换方法。 第一种方法 在GitHub上有人开发了可以做该种转换的R包&#xff0c;…

启航新篇,量算未来 | 量子计算创新论坛成功举办!

4月28日下午&#xff0c;在2024中国移动算力网络大会——未来启航•量子计算创新论坛在苏州金鸡湖国际会议中心举办。本次论坛以“创新求发展&#xff0c;合作赢未来”为主题&#xff0c;旨在汇聚行业前沿思想&#xff0c;共谋创新发展大计&#xff0c;共同推动我国量子计算产业…

网络性能测试工具iperf3 和iperf

目录 1. iperf工具介绍 2. 下载安装 3. 使用方法 1. iperf工具介绍 iperf 是一个网络性能测试工具&#xff0c;用于测量网络带宽和性能。它可以在客户端和服务器之间进行数据传输&#xff0c;并提供了丰富的选项来配置测试参数和输出格式。 iperf 和 iperf3 都是用于测量网…

多链路聚合设备是什么

多链路聚合设备属于通信指挥装备。 乾元通多链路聚合设备&#xff0c;它能够将多个网络链路聚合成一个逻辑链路&#xff0c;以实现高速、稳定、可靠的数据传输。多链路聚合设备的核心技术包括链路聚合、负载均衡、故障切换等&#xff0c;能够智能管理和优化利用不同网络链路&a…

sql编写规范(word原件)

编写本文档的目的是保证在开发过程中产出高效、格式统一、易阅读、易维护的SQL代码。 1 编写目的 2 SQL书写规范 3 SQL编写原则 软件全套资料获取进主页或者本文末个人名片直接获取。

Inflate动态Huffman解压缩

上个已经实现GZIP压缩文件格式的Inflate静态Huffman解压&#xff0c;这个实现Inflate的无压缩输出和动态Huffman解压。 Java语言实现&#xff0c;Eclipse下编写。 范式Huffman解码实现&#xff0c;输入huffman编码&#xff0c;输出原始数据 // 范式huffman解码static class C…