设计模式之策略模式

首先看定义,策略模式:策略模式定义了一系列算法,并将每一个算法封装起来,且使它们可以互相替换,此模式让算法的变化独立于使用算法的客户端。

我的理解就是,分装起来的算法要实现相互替换,则说明这些算法是具有共性的,而客户端使用他们的条件则是必须满足这个共性。这样当客户端使用的策略被替换之后,也不会对客户端造成影响。

比如说我们有个功能是要给一堆数字排序,客户端在调用的时候不会考虑你用的具体是冒泡排序还是快速排序。它只需要我们的接口给他返回排好序的结果即可。这时我们的冒泡排序等算法就是策略,他们相互替换时是不会影响我们原本对数字排序这个工作的。

上代码,我是一个CS玩家,这里用CS举个例子。

首先我们的步枪都实现一个GUN接口,他们的共同点是都可以瞄准、单发射击、连发射击。在策略模式里,GUN接口的角色就是策略接口。

 1 package com.java.Strategy;
 2 
 3 public interface Gun {
 4     //单发射击
 5     public void singleFire();
 6     //连发射击
 7     public void multiFire();
 8     //瞄准
 9     public void aim();
10 }

然后是三个主战武器,AK M4 AWP。他们都实现了GUN接口。但是他们的瞄准、射击的特点都不相同。这里三把枪的角色为拥有不同的实现的具体策略

 1 package com.java.Strategy;
 2 
 3 public class AK47 implements Gun{
 4 
 5     @Override
 6     public void singleFire() {
 7         System.out.println("单发,第一发很准,可以爆头");
 8     }
 9 
10     @Override
11     public void multiFire() {
12         System.out.println("连发,前三枪比较准,不稳定");
13     }
14 
15     @Override
16     public void aim() {
17         System.out.println("只能用准心瞄准");
18     }
19 
20 }
21 package com.java.Strategy;
22 
23 public class M4A4 implements Gun{
24 
25     @Override
26     public void singleFire() {
27         System.out.println("连发,前几枪比较准,比较稳定");
28     }
29 
30     @Override
31     public void multiFire() {
32         System.out.println("单发,不能爆头");
33     }
34 
35     @Override
36     public void aim() {
37         System.out.println("只能用准心瞄准");
38     }
39 
40 }
41 package com.java.Strategy;
42 
43 public class AWP implements Gun{
44 
45     @Override
46     public void singleFire() {
47         System.out.println("威力巨大,不瞄准很难打准");
48     }
49 
50     @Override
51     public void multiFire() {
52         System.out.println("不能连发");
53     }
54 
55     @Override
56     public void aim() {
57         System.out.println("用瞄准镜瞄准");
58     }
59 
60 }

最后是游戏角色,警察可以捡枪、开枪射击等。警擦的角色为客户端,策略的调用者。

 1 package com.java.Strategy;
 2 
 3 public class Police {
 4     private Gun gun;
 5     
 6     public void shoot(){
 7         gun.aim();
 8         gun.singleFire();
 9         gun.multiFire();
10     }
11     
12     public void pickGun(Gun gun){
13         this.gun = gun;
14     }
15     
16 }

我们来测试一下。

 1 package com.java.Strategy;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         Police police=new Police();
 6         police.pickGun(new AK47());
 7         police.shoot();
 8         
 9         police.pickGun(new AWP());
10         police.shoot();
11         
12         
13         police.pickGun(new M4A4());
14         police.shoot();
15     }
16 }

测试结果如下:

只能用准心瞄准
单发,第一发很准,可以爆头
连发,前三枪比较准,不稳定
用瞄准镜瞄准
威力巨大,不瞄准很难打准
不能连发
只能用准心瞄准
连发,前几枪比较准,比较稳定
单发,不能爆头

我们可以看出,警察不管捡起哪把枪都不会影响他的射击。满足我们的策略模式的定义。

以上就是我对策略模式的理解。欢迎留言交流。

 

posted @ 2018-04-30 14:24  最喜欢蕙蕙了  阅读(148)  评论(0编辑  收藏  举报