编程-设计模式 22:策略模式

server/2024/12/23 6:20:09/

设计模式 22:策略模式

定义与目的
  • 定义策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。
  • 目的:该模式的主要目的是将一组相关的算法封装成一系列可互换的类,并使它们可以相互替换。这样,算法可以独立于使用它的客户而变化。
实现示例

假设我们有一个简单的游戏,玩家可以选择不同的战斗策略来攻击敌人。我们可以使用策略模式来实现这个需求。

// 抽象策略
interface BattleStrategy {void attack();
}// 具体策略 - 近战攻击
class MeleeAttack implements BattleStrategy {@Overridepublic void attack() {System.out.println("Swinging sword!");}
}// 具体策略 - 远程攻击
class RangedAttack implements BattleStrategy {@Overridepublic void attack() {System.out.println("Shooting arrow!");}
}// 具体策略 - 魔法攻击
class MagicAttack implements BattleStrategy {@Overridepublic void attack() {System.out.println("Casting fireball!");}
}// 上下文 - 玩家
class Player {private BattleStrategy strategy;public Player(BattleStrategy strategy) {this.strategy = strategy;}public void setStrategy(BattleStrategy strategy) {this.strategy = strategy;}public void doBattle() {System.out.println("Player attacks:");strategy.attack();}
}// 客户端代码
public class Client {public static void main(String[] args) {Player player = new Player(new MeleeAttack());player.doBattle();  // 输出: Player attacks: Swinging sword!player.setStrategy(new RangedAttack());player.doBattle();  // 输出: Player attacks: Shooting arrow!player.setStrategy(new MagicAttack());player.doBattle();  // 输出: Player attacks: Casting fireball!}
}
使用场景
  • 当你需要在运行时选择不同的算法或行为时。
  • 当一组相关的行为应该可以动态地互换时。
  • 当算法的变化独立于使用它的客户时。

策略模式通过将一组相关的算法封装成一系列可互换的类,并使它们可以相互替换,使得算法可以独立于使用它的客户而变化。这对于需要在运行时选择不同的算法或行为的场景非常有用。

小结

策略模式是一种常用的行为型模式,它可以帮助你将一组相关的算法封装成一系列可互换的类,并使它们可以相互替换。这对于需要在运行时选择不同的算法或行为的场景非常有用。


http://www.ppmy.cn/server/99122.html

相关文章

演示:基于WPF的DrawingVisual开发GS(2019)1822号矢量中国地图一

一、目的:基于WPF的DrawingVisual开发的矢量地图 二、预览 默认样式 深黑样式 深蓝色样式 深蓝色透明样式 演示:基于WPF的DrawingVisual开发GS(2019)1822号矢量中国地图二-CSDN博客VS2022,net7演示:基于WPF的DrawingVisual开发GS…

PCIe学习笔记(20)

接收tlp处理(Handling of Received TLPs) 本节描述了当接收到的TLP从接收数据链路层传送到接收事务层,并且在数据链路层已经验证了接收到的TLP的完整性后,如何处理所有接收到的TLP •保留字段中的值必须被接收方忽略。 •如果F…

如何通过【腾讯云 AI 代码助手】快速解决商城项目难题

文章目录 引言开发环境介绍从 IDE 插件市场安装 腾讯云AI代码助手实战问题一:如何使用RabbitMQ的死信队列来实现关闭订单的操作?并编写java代码问题二:在解决库存问题时,如何使用Redis的分布式锁来实现呢? 获得的帮助与…

Spring经典面试题总结

spring是什么? 轻量级的开源的J2EE框架。它是一个容器框架,用来装javabean(java对象),中间层框架(万能胶) 可以起一个连接作用,比如说把Struts和hibernate粘合在一起运用&#xff…

【Kubernetes】k8s集群中pod的容器资源限制和三种探针

目录 一.关于pod容器的资源限制 1.资源限制的单位 1.1.CPU 资源单位 1.2.内存 资源单位 二.关于QOS服务质量(pod的调度和驱逐有限制) 1.QoS服务质量分类 2.驱逐顺序 三.关于pod容器的三种探针 1.探针的三种规则 2.Probe支持三种检查方法 3.探…

Android全面解析之context机制(二): context创建流程

前言 这篇文章来看关于context创建的源码流程。 在上一篇Android全面解析之Context机制(一) :初识context一文中讲解了context的相关实现类。经过前面的讨论,读者对于context在心中有了一定的理解。但始终觉得少点什么:activity是什么时候被创建的&…

创建一个自己的列表窗口

文章目录 背景:在QT的设计中,对于控件库提供的控件满足不了项目的需求,就像自定义一些控件,本文是自定义一个列表窗口。效果展示 一、创建基本的QT模板:1.创建mainwindow2.创建VerticalTextDelegate 二: 插…

搜维尔科技:ART应用于大规模跟踪 、 高精度测量 、培训和维护 、虚拟电影制作

ART应用于大规模跟踪 、 高精度测量 、培训和维护 、虚拟电影制作 搜维尔科技:ART应用于大规模跟踪 、 高精度测量 、培训和维护 、虚拟电影制作