设计模式之策略模式
首先看定义,策略模式:策略模式定义了一系列算法,并将每一个算法封装起来,且使它们可以互相替换,此模式让算法的变化独立于使用算法的客户端。
我的理解就是,分装起来的算法要实现相互替换,则说明这些算法是具有共性的,而客户端使用他们的条件则是必须满足这个共性。这样当客户端使用的策略被替换之后,也不会对客户端造成影响。
比如说我们有个功能是要给一堆数字排序,客户端在调用的时候不会考虑你用的具体是冒泡排序还是快速排序。它只需要我们的接口给他返回排好序的结果即可。这时我们的冒泡排序等算法就是策略,他们相互替换时是不会影响我们原本对数字排序这个工作的。
上代码,我是一个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 }
测试结果如下:
只能用准心瞄准
单发,第一发很准,可以爆头
连发,前三枪比较准,不稳定
用瞄准镜瞄准
威力巨大,不瞄准很难打准
不能连发
只能用准心瞄准
连发,前几枪比较准,比较稳定
单发,不能爆头
我们可以看出,警察不管捡起哪把枪都不会影响他的射击。满足我们的策略模式的定义。
以上就是我对策略模式的理解。欢迎留言交流。