一、模式定义
定义了算法族,分别封装起来,让他们之间相互可以替换,对于算法的使用者,可以根据自身的需要进行随意的组合;即:模式的变化独立于算法的使用者;
二、案例说明
假设现在开发一款游戏,设定场景如下:
| 类型 | 外观 | 移动 | 攻击 |
| 普通战士 | 普通 | 只能往一个方向移动 | 徒手 |
| 剑士 | 普通+手持长剑 | 只能往一个方向移动 | 砍 |
第二个版本进行迭代:
| 类型 | 外观 | 移动 | 攻击 |
| 普通战士 | 普通 | 只能往一个方向移动 | 徒手 |
| 剑士 | 普通+手持长剑 | 只能往一个方向移动 | 砍 |
| 斧手 | 普通+双手持斧 | 只能往一个方向移动 | 砍 |
| 其他更多 | ..... | ..... | ..... |
第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 }