阅读 90

设计模式-谋略模式

一、模式定义

定义了算法族,分别封装起来,让他们之间相互可以替换,对于算法的使用者,可以根据自身的需要进行随意的组合;即:模式的变化独立于算法的使用者;

二、案例说明

假设现在开发一款游戏,设定场景如下:

类型外观移动攻击
普通战士普通只能往一个方向移动徒手
剑士普通+手持长剑只能往一个方向移动

第二个版本进行迭代:

类型外观移动攻击
普通战士普通只能往一个方向移动徒手
剑士普通+手持长剑只能往一个方向移动
斧手普通+双手持斧只能往一个方向移动
其他更多...............

第N个版本迭代——在普通开发没有任何设计模式介入的情况下,这时候开发、测试、产品已经进入了白热化阶段,都想把对方先XXXXX再XXXXX;

根据上面这个例子进行分析,不管是什么样的僵尸,外观、移动、攻击是稳定的模式部分,不同的是内容;接下来对稳定部分进行抽象,不同的内容赋予对应僵尸不同的行为;行为发生改变不会对僵尸其他内容产生干扰;

三、示例代码

  1 /**
  2  * 类描述:  谋略模式Demo
  3  *
  4  * @author XXSD
  5  * @version 1.0.0
  6  * @date 2020/1/21 0021 上午 10:04
  7  */
  8 public class StrategyTest {
  9     public static void main(String[] values) {
 10         System.out.println("普通战士进入战场:");
 11         MovePatterns movePatterns = new MoveType();
 12         GuisePatterns guisePatterns = new GuiseType();
 13         AttackPatterns attackPatterns = new AttackType();
 14         final OrdinaryFighter ordinaryFighter = new OrdinaryFighter(guisePatterns, attackPatterns, movePatterns).setName("普通战士");
 15         ordinaryFighter.play();
 16         System.out.println("——————————————————————————————");
 17         System.out.println("剑士进入战场:");
 18         movePatterns = new SwordMoveType();
 19         guisePatterns = new SwordGuiseType();
 20         attackPatterns = new SwordAttackType();
 21         final OrdinaryFighter ordinaryFighter1 = new OrdinaryFighter(guisePatterns, attackPatterns, movePatterns).setName("普通战士");
 22         ordinaryFighter1.play();
 23 
 24         System.out.println("——————————————————————————————");
 25         System.out.println("普通战士升级为火焰普通战士:");
 26         ordinaryFighter.setMovePatterns(new UpgradeMoveType());
 27         ordinaryFighter.setGuisePatterns(new UpgradeGuiseType());
 28         ordinaryFighter.setAttackPatterns(new UpgradeAttackType());
 29         ordinaryFighter.play();
 30 
 31     }
 32 }
 33 
 34 /**
 35  * 类描述: 移动能力抽象
 36  *
 37  * @author : XXSD
 38  * @date : 2020/1/21 0021 上午 10:38
 39  */
 40 interface MovePatterns {
 41     void move();
 42 }
 43 
 44 /**
 45  * 类描述: 攻击能力抽象
 46  *
 47  * @author : XXSD
 48  * @date : 2020/1/21 0021 上午 10:40
 49  */
 50 interface AttackPatterns {
 51     void attack();
 52 }
 53 
 54 /**
 55  * 类描述: 外观能力抽象
 56  *
 57  * @author : XXSD
 58  * @date : 2020/1/21 0021 上午 10:41
 59  */
 60 interface GuisePatterns {
 61     void guise();
 62 }
 63 
 64 /**
 65  * 类描述: 战士抽象
 66  *
 67  * @author : XXSD
 68  * @date : 2020/1/21 0021 上午 10:47
 69  */
 70 abstract class AbstractFighter {
 71     /**
 72      * 属性描述:战士的外观
 73      *
 74      * @date : 2020/1/21 0021 上午 10:49
 75      */
 76     GuisePatterns guisePatterns;
 77     /**
 78      * 属性描述:战士的攻击
 79      *
 80      * @date : 2020/1/21 0021 上午 10:50
 81      */
 82     AttackPatterns attackPatterns;
 83     /**
 84      * 属性描述:战士的移动
 85      *
 86      * @date : 2020/1/21 0021 上午 10:50
 87      */
 88     MovePatterns movePatterns;
 89 
 90     /**
 91      * 功能描述:战士抽象
 92      *
 93      * @param guisePatterns  外观
 94      * @param attackPatterns 攻击
 95      * @param movePatterns   移动
 96      * @author : XXSD
 97      * @date : 2020/1/21 0021 上午 10:53
 98      */
 99     public AbstractFighter(GuisePatterns guisePatterns, AttackPatterns attackPatterns, MovePatterns movePatterns) {
100         this.guisePatterns = guisePatterns;
101         this.attackPatterns = attackPatterns;
102         this.movePatterns = movePatterns;
103     }
104 
105     /**
106      * 功能描述:开始执行
107      *
108      * @author : XXSD
109      * @date : 2020/1/21 0021 上午 10:50
110      */
111     abstract void play();
112 
113     /**
114      * 功能描述:战士的外观
115      *
116      * @author : XXSD
117      * @date : 2020/1/21 0021 上午 10:50
118      */
119     public GuisePatterns getGuisePatterns() {
120         return guisePatterns;
121     }
122 
123     /**
124      * 功能描述:战士的外观
125      *
126      * @author : XXSD
127      * @date : 2020/1/21 0021 上午 10:50
128      */
129     public void setGuisePatterns(GuisePatterns guisePatterns) {
130         this.guisePatterns = guisePatterns;
131     }
132 
133     /**
134      * 功能描述:战士的攻击
135      *
136      * @author : XXSD
137      * @date : 2020/1/21 0021 上午 10:50
138      */
139     public AttackPatterns getAttackPatterns() {
140         return attackPatterns;
141     }
142 
143     /**
144      * 功能描述:战士的攻击
145      *
146      * @author : XXSD
147      * @date : 2020/1/21 0021 上午 10:51
148      */
149     public void setAttackPatterns(AttackPatterns attackPatterns) {
150         this.attackPatterns = attackPatterns;
151     }
152 
153     /**
154      * 功能描述:战士的移动
155      *
156      * @author : XXSD
157      * @date : 2020/1/21 0021 上午 10:51
158      */
159     public MovePatterns getMovePatterns() {
160         return movePatterns;
161     }
162 
163     /**
164      * 功能描述:战士的移动
165      *
166      * @author : XXSD
167      * @date : 2020/1/21 0021 上午 10:51
168      */
169     public void setMovePatterns(MovePatterns movePatterns) {
170         this.movePatterns = movePatterns;
171     }
172 }
173 
174 /**
175  * 类描述: 普通战士
176  *
177  * @author : XXSD
178  * @date : 2020/1/21 0021 上午 11:00
179  */
180 class OrdinaryFighter extends AbstractFighter {
181 
182     /**
183      * 属性描述:名称
184      *
185      * @date : 2020/1/21 0021 上午 11:00
186      */
187     private String name;
188 
189     /**
190      * 功能描述:战士抽象
191      *
192      * @param guisePatterns  外观
193      * @param attackPatterns 攻击
194      * @param movePatterns   移动
195      * @author : XXSD
196      * @date : 2020/1/21 0021 上午 10:53
197      */
198     public OrdinaryFighter(GuisePatterns guisePatterns, AttackPatterns attackPatterns, MovePatterns movePatterns) {
199         super(guisePatterns, attackPatterns, movePatterns);
200     }
201 
202     /**
203      * 功能描述:开始执行
204      *
205      * @author : XXSD
206      * @date : 2020/1/21 0021 上午 10:50
207      */
208     @Override
209     void play() {
210         System.out.println(name + "开始执行");
211         getGuisePatterns().guise();
212         getMovePatterns().move();
213         getAttackPatterns().attack();
214     }
215 
216     /**
217      * 功能描述:名称
218      *
219      * @author : XXSD
220      * @date : 2020/1/21 0021 上午 11:01
221      */
222     public String getName() {
223         return name;
224     }
225 
226     /**
227      * 功能描述:名称
228      *
229      * @author : XXSD
230      * @date : 2020/1/21 0021 上午 11:01
231      */
232     public OrdinaryFighter setName(String name) {
233         this.name = name;
234         return this;
235     }
236 }
237 
238 /**
239  * 类描述: 移动方式
240  *
241  * @author : XXSD
242  * @date : 2020/1/21 0021 上午 10:57
243  */
244 class MoveType implements MovePatterns {
245 
246     @Override
247     public void move() {
248         System.out.println("一个方向移动,一步一步的走");
249     }
250 }
251 
252 /**
253  * 类描述: 外观方式
254  *
255  * @author : XXSD
256  * @date : 2020/1/21 0021 上午 10:58
257  */
258 class GuiseType implements GuisePatterns {
259 
260     @Override
261     public void guise() {
262         System.out.println("普通外观");
263     }
264 }
265 
266 /**
267  * 类描述: 攻击方式
268  *
269  * @author : XXSD
270  * @date : 2020/1/21 0021 上午 10:59
271  */
272 class AttackType implements AttackPatterns {
273 
274     @Override
275     public void attack() {
276         System.out.println("徒手普通攻击");
277     }
278 }
279 
280 /**
281  * 类描述: 移动方式
282  *
283  * @author : XXSD
284  * @date : 2020/1/21 0021 上午 10:57
285  */
286 class UpgradeMoveType implements MovePatterns {
287 
288     @Override
289     public void move() {
290         System.out.println("一个方向移动,一步一跳的走");
291     }
292 }
293 
294 /**
295  * 类描述: 外观方式
296  *
297  * @author : XXSD
298  * @date : 2020/1/21 0021 上午 10:58
299  */
300 class UpgradeGuiseType implements GuisePatterns {
301 
302     @Override
303     public void guise() {
304         System.out.println("普通外观,发红");
305     }
306 }
307 
308 /**
309  * 类描述: 攻击方式
310  *
311  * @author : XXSD
312  * @date : 2020/1/21 0021 上午 10:59
313  */
314 class UpgradeAttackType implements AttackPatterns {
315 
316     @Override
317     public void attack() {
318         System.out.println("徒手带火焰属性攻击");
319     }
320 }
321 
322 /**
323  * 类描述: 移动方式
324  *
325  * @author : XXSD
326  * @date : 2020/1/21 0021 上午 10:57
327  */
328 class SwordMoveType implements MovePatterns {
329 
330     @Override
331     public void move() {
332         System.out.println("一个方向移动,举着手中的剑一步一步的走");
333     }
334 }
335 
336 /**
337  * 类描述: 外观方式
338  *
339  * @author : XXSD
340  * @date : 2020/1/21 0021 上午 10:58
341  */
342 class SwordGuiseType implements GuisePatterns {
343 
344     @Override
345     public void guise() {
346         System.out.println("普通外观,单手持剑");
347     }
348 }
349 
350 /**
351  * 类描述: 攻击方式
352  *
353  * @author : XXSD
354  * @date : 2020/1/21 0021 上午 10:59
355  */
356 class SwordAttackType implements AttackPatterns {
357 
358     @Override
359     public void attack() {
360         System.out.println("单手剑攻击");
361     }
362 }
复制代码
文章分类
后端
文章标签