Strategy Pattern 教你秒变“神枪手”

网站建设4年前发布
35 0 0

做一件事情有不同的实现方式,可以将变化的部分和不变的部分剥离开,去除大量的 if/else,提供高扩展性。,比如我们想要带妹吃鸡,就要成为一个神枪手。在各种枪战游戏中,有各种不同的枪,我们要根据射程的不同选择不同的枪进行射击。,如果枪的子弹数量都不富裕,我们要用最少的子弹,最合适的方法达到最强伤害,最终大吉大利。,当我们距离对手:,我觉得这有 3 个问题,具体分析如下:,我看这么多 if/else 语句,里面的 sout 语句目前三四行也还好,如果我们有上百行的语句,里面也有很多 if/else,这样都不知道下个主 if 跑哪去啦 ,全都需要发现敌人,如果发现敌人是个成百上千行代码,就很麻烦啦。,如果这时候我们新增了一种枪,比如是霰弹枪,适用 10 到 20 的时候使用,这时候我们就需要在加一个 if 语句如下:,这个看着也没啥大问题的样子,不就是加了个 if 么,但是由于我们改动了这个文件,测试同学问我们需要测试哪些功能,说是测一种枪需要 5 天。,问题来啦,本来说是你增加一种枪, 需要测 5 天,但是现在你说改了这文件,上下可能有些局部变量共享的,或者有些方法可能改了入参的值,这些有负作用的方法被调用啦,所以可能狙击枪也得测一测,可能手枪也得测一测。,测试同学崩了,本来 5 天的工作量,搞成了 5 * 6 天,一个月都在测枪。,我们先定义好一个基础类,解决一下可读性问题和重复性问题。,定义一个基础武器类:,逐个实现武器的具体类、平底锅、冲锋枪、步枪等类如下:,我们的方法就可以改动得更清晰啦。,类图如下:,20230306101754b230d9d2289f036058d59360449ea27dba0a85620,上面的代码没有解决最根本的问题,也就是去除 if/else,所用的方法其实就是将 if else 转换为 for,这样的代码后续添加枪就不需要再增加新的类型啦。,我们先定义一个通用的策略模式接口如下:,入参和出参都是基本的抽象类:,实现一个武器抽象类实现接口:,其中的 Range 类实现如下:,依次实现这个抽象武器策略类:,定义一个上下文类来对入参进行路由:,最后在主方法里面调用就好啦:,结果如下:,类图如下:,202303061017540836e61154ae5f793ea851e58505ac35ed6e85484

© 版权声明

相关文章