设计模式详解(一)——策略模式

策略模式(Strategy Pattern)是一种行为型的设计模式,它允许你定义一系列算法,然后将它们封装起来,使它们可以相互替换。这样做的好处是,你可以动态地选择要使用的算法,而不必在运行时进行检查或实例化。

1、策略模式通常由三个角色组成:

  1. 策略接口/抽象类:定义了算法的接口或抽象类。
  2. 具体策略实现:实现了策略接口或抽象类的具体类。
  3. 客户端:使用策略接口或抽象类来调用具体的策略实现。

2、示例:

下面是一个简单的Java示例,展示了如何使用策略模式来实现加法运算:

// 定义策略接口
interface CalculatorStrategy {int calculate(int a, int b);
}// 具体策略实现
class AddStrategy implements CalculatorStrategy {@Overridepublic int calculate(int a, int b) {return a + b;}
}class SubtractStrategy implements CalculatorStrategy {@Overridepublic int calculate(int a, int b) {return a - b;}
}// 客户端
class Client {private CalculatorStrategy strategy;public void setStrategy(CalculatorStrategy strategy) {this.strategy = strategy;}public int calculate(int a, int b) {return strategy.calculate(a, b);}
}public class StrategyPatternExample {public static void main(String[] args) {// 创建客户端Client client = new Client();// 设置策略client.setStrategy(new AddStrategy());// 调用客户端System.out.println(client.calculate(5, 3)); // 输出 8// 更改策略并再次调用客户端client.setStrategy(new SubtractStrategy());System.out.println(client.calculate(5, 3)); // 输出 2}
}

在这个例子中,我们定义了一个CalculatorStrategy接口,它包含了一个calculate(int a, int b)方法。然后我们创建了两个具体的策略实现AddStrategySubtractStrategy,分别实现了加法和减法操作。最后,我们在客户端中设置不同的策略,并通过调用calculate(int a, int b)方法来执行相应的计算。

3、策略模式的使用场景:

算法选择:当需要根据不同的条件来选择不同的算法时,策略模式非常适用。例如,在一个游戏中,可能需要根据玩家的等级来选择不同的难度级别。
参数化接口:当需要定义一系列相关的类,而这些类都共享相同的接口或抽象类时,策略模式可以帮助你简化代码,并提高代码的可维护性。
扩展性:策略模式允许你动态地添加新的算法,而无需修改现有的代码。

4、优缺点

优点:

灵活性:由于策略模式允许你在运行时动态地切换算法,因此它提高了代码的灵活性和可扩展性。
可维护性:策略模式使得代码更加模块化,每个具体的策略实现都是独立的,这样就更容易理解和维护。
复用性:策略模式鼓励代码的复用,因为你可以创建多个具体的策略实现,并在需要时动态地选择其中一个。

缺点:

复杂性:策略模式可能会增加代码的复杂性,特别是当你有大量策略实现时。

性能开销:由于策略模式涉及到对象的创建和销毁,所以在某些情况下,它可能会带来一定的性能开销。

5、策略模式的应用举例:

在游戏开发中,可以使用策略模式来实现不同类型的敌人行为,比如普通敌人、BOSS等。
在电子商务网站中,可以使用策略模式来实现不同的商品促销策略,比如打折、满减等。

总的来说,策略模式是一种强大的设计模式,它能够帮助你有效地解决一些特定的问题,但同时也需要注意其潜在的复杂性和性能影响。

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

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

相关文章

多媒体基础

笔者按: 昨日复习的信息网络安全约莫是挂了,常言道:知耻而后勇。诚如斯言 于是决心多媒体是不能再挂了,不然直接变成xxx之流,自增笑耳 语雀链接:多媒体基础 一.多媒体计算机概述 媒体:承载信息…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-21多输入多输出通道

21多输入多输出通道 import torch from d2l import torch as d2ldef corr2d(X, K):"""计算二维互相关运算"""h, w K.shapeY torch.zeros((X.shape[0] - h 1, X.shape[1] - w 1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i,…

go语言DAY7 字典Map 指针 结构体 函数

Go中Map底层原理剖析_go map底层实现-CSDN博客 目录 Map 键值对key,value 注意: map唯一确定的key值通过哈希运算得出哈希值 一、 map的声明及初始化: 二、 map的增删改查操作: 三、 map的赋值操作与切片对比: 四、 通用所有…

[leetcode hot 150]第一百二十二题,买卖股票的最佳时机Ⅱ

题目: 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。 返回 你能获得的 最大…

【C++】初识C++(一)

一.什么是C C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度 的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object o…

图形处理单元(GPU)在现代计算中的应用与挑战(研究论文框架)

摘要:随着高性能计算需求的日益增长,图形处理单元(GPU)已从专业的图形渲染处理器转变为具有高性能并行处理能力的多功能计算平台。本文将探讨GPU的核心优势、编程模型、在不同领域的应用以及面临的挑战和限制。此外,还将讨论GPU技术的未来发展趋势和潜在的研究机会。 关键…

mongodb 查询语句学习笔记

基础查询 正则查询 {status: A,$or: [{ qty: { $lt: 30 } }, { item: { $regex: ^p } }] }AND 查询 { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" }OR 查询 { $or: [ { status: "A" }, { qty: { $lt: 30 } …

2024年机动车签字授权人题库,助你冲刺!绝对不会让你后悔!

61.()使汽车按驾驶人选定的方向行驶。 A.传动系统 B.行驶系统 C.转向系统 D.制动系统 答案:C 62.()使汽车各总成及部件安装在适当的位置,对全车起支承作用以保证汽车正常行驶。 A.传动系统 B.行驶系…

01.计算机图形学概述

01.计算机图形学概述 从技术的角度上看,什么是一个好的画面? 直接看这个画面是不是足够亮,这体现了渲染中的一个技术叫全局光照。 应用范围 游戏( Video Games)电影/特效( Movies)动漫/动画&…

如何让Linux系统变得更安全?

本文尝试从linux安全加固、漏洞利用及防御措施、安全意识三个方面思考如何让linux系统变得更加安全. 一、linux常见安全加固操作 对Linux系统进行详细的安全加固操作,可以从多个方面进行,包括系统更新和补丁管理、用户和权限管理、网络安全配置、文件和系统安全、日志和审计…

Qt代码分析

要使用代码分析工具,请在Analyze菜单或(Start Debugging of Startup Project)按钮的下拉菜单中选择它。当您处于调试模式时,您可以通过在调试器工具栏上的菜单中选择工具来切换工具。 您可以将调试模式下的视图拖放到屏幕上的新位置。意见的大小和立场将…

c++关键字default,delete

文章目录 概述defaultdelete 小结 概述 在看一些开源项目的源码的时候,经常会看到default和delete。这2个关键字究竟什么意思呢?这篇文章就来一点一点拆解下。 default 默认构造函数、拷贝构造函数、移动构造函数、拷贝赋值运算符、移动赋值运算符和析…

HDFS学习

3.5 HDFS存储原理 3.5.1 冗余数据保存 作为一个分布式文件系统,为了保证系统的容错性和可用性,HDFS采用了多副本方式对数据进行冗余存储,通常一个数据块的多个副本会被分布到不同的数据节点上。 如图所示,数据块1被分别存放到…

石油化工厂为什么要用专业防爆手机?

防爆手机之所以必须使用专业设计的产品,主要是出于安全考虑,以防止在易燃易爆环境中因手机使用不当引发爆炸事故。以下几点详细解释了使用专业化工防爆手机的必要性: 本质安全设计:顶坚专业防爆手机采用了本质安全(本安…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-47转置卷积

47转置卷积 import torch from torch import nn from d2l import torch as d2l# 输入矩阵X和卷积核矩阵K实现基本的转置卷积运算 def trans_conv(X, K):h, w K.shapeY torch.zeros((X.shape[0] h - 1, X.shape[1] w - 1))for i in range(X.shape[0]):for j in range(X.shap…

昇思25天学习打卡营第5天|数据变换Transforms

数据变换Transforms 介绍Transforms分类Common TransformsVision TransformsText TransformsPythonTokenizer LookupLambda Transforms 参考 介绍 MindSpore提供不同种类的数据变换(Transforms),配合数据处理Pipeline来实现数据预处理。 所有…

【ROS】apt 找不到 ROS版本?(ROS1和ROS2通用方案)

问题描述 安装ROS底层系统时,经常遇到一个情况就是apt找不到ros的对应版本 解决方案 添加ros官方给的apt源和安装密钥 ROS1 # ros奖项 sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.li…

数学建模 —— MATLAB中的向量

目录 向量的创建方法 (1)直接输入法 (2)冒号法(常用) (3)利用MATLAB函数创建 linspace函数 logspace函数 向量元素的引用 (1)单个元素引用 (2)多个元素引用 向量元素的修改和删除 向量的创建方法 在 MATLAB中,向量的创建方法主要有…

微软Edge浏览器多用户配置文件管理:个性化浏览体验

在家庭或工作环境中,经常需要在同一台计算机上为多个用户创建和管理独立的浏览体验。微软Edge浏览器提供了多用户配置文件管理功能,允许用户为每个账户设置独立的书签、历史记录、密码、扩展和设置。本文将详细介绍如何在微软Edge中管理多个用户配置文件…

连接Sql Server时报错:无法通过使用安全套接字层加密与 SQL Server 建立安全连接

JDBC连接Sql Server时报错:无法通过使用安全套接字层加密与 SQL Server 建立安全连接 前言解决办法一解决办法二总结 前言 今天使用jdbc连接sql server突然报错为:SQLServerException: “Encrypt”属性设置为“true”且 “trustServerCertificate”属性设置为“fals…