策略模式的应用——游戏中武器的选择

2024-05-28 16:18

本文主要是介绍策略模式的应用——游戏中武器的选择,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。策略模式是一种对象行为型模式。
这里写图片描述

在策略模式结构图中包含如下几个角色:

Context(环境类):环境类是使用算法的角色,在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略,实际上环境类将调用策略类中实现算法的方法。环境类针对抽象策略进行编程,无需知道具体是哪一种策略,只要该策略类中实现了具体的算法方法就可以。在同一时刻,环境类只能使用一种策略,而不能使用多种。

Strategy(抽象策略类):它为所支持的算法声明了抽象方法,是所有策略类的父类,它可以是抽象类或具体类,也可以是接口。环境类通过抽象策略类中声明的方法在运行时调用具体策略类中实现的算法。

ConcreteStrategy(具体策略类):它实现了在抽象策略类中声明的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。

策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列具体策略类里面,作为抽象策略类的子类。在策略模式中,对环境类和抽象策略类的理解非常重要,环境类是需要使用算法的类。

游戏武器系统的设计与实现

伪代码

////////////环境类///////////////////////class 玩家{武器 _weapon;设置武器(weapon){_weapon = weapon;}射击(){_weapon->射击();};
}////////////策略类///////////////////////class 武器{射击();
}class M4A1-翔龙: 武器{射击(){printf("翔龙射击");};
}class AT15-沙丘: 武器{射击(){printf("沙丘射击");};
}class KAC锯式机枪: 武器{射击(){printf("机枪扫射");};
}////////////客户端///////////////////////...
玩家 player = new 玩家();
武器 weapon = new KAC锯式机枪();
player->设置武器(weapon);
...
player->射击();
...

应用场景以及优缺点

1)应用场景

只要涉及到算法的封装、复用和切换都可以考虑使用策略模式。

2)优点

采用该模式可以方便地更换算法或者增加新的算法。避免了较难维护的多重选择条件选择语句。

3)缺点
缺点1:客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法。
解决方案:搭配简单工厂模式

缺点2:客户端一次只能使用一个策略类,也就是说每个具体策略间相互独立。
解决方案:装饰模式(待实践)。

参考此链接

策略模式具体应用

(1)电影院打折算法,成年人全票、VIP6折、儿童票与学生票0.5折优惠。

(2)数据导出:可以导出到数据库、也可以导出到Xml,或者文本文件中。比如:系统异常信息Log,可以记录到数据库也可以记录到文件中。再如:网页上的信息可以转为Word格式保存,也可以转为PDF格式保存。

(3)网络购物,可以选择货到付款、也可以选择U盾支付、还可以选择支付宝支付等支付方式。

(4)对于加密软件的开发,可以选择不同类型的加密算法,肯定不会只有一种加密算法。同样遍历二叉树,存在先序遍历。中序遍历、后序遍历、层序遍历等四种遍历算法,根据需要选择具体的某种遍历算法。还有数据结构中的各种排序算法,根据具体情况选择某个排序算法。

(5)QQ空间背景风格,可以根据需要选择某种喜欢的风格,用来装扮空间。

(6)UI容器管理器,用于管理各种类型控件布局方式。存在多种不同的布局方式,根据美观程度,选择某种布局方式。

这篇关于策略模式的应用——游戏中武器的选择的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011058

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

Python循环缓冲区的应用详解

《Python循环缓冲区的应用详解》循环缓冲区是一个线性缓冲区,逻辑上被视为一个循环的结构,本文主要为大家介绍了Python中循环缓冲区的相关应用,有兴趣的小伙伴可以了解一下... 目录什么是循环缓冲区循环缓冲区的结构python中的循环缓冲区实现运行循环缓冲区循环缓冲区的优势应用案例Python中的实现库

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3