策略模式
什么是策略模式
策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化
策略模式是对算法的包装,是把使用算法的责任和算法本身分开。策略模式通常是把一系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。
例如下象棋时,炮的前进策略和马、兵的策略是不一样的,算法是有区别的。
我们开始实战,为了说明问题,我们以上图为例做一个超级简单的象棋(简单到没法玩象棋,嘿嘿),假设现在象棋只有炮、兵、将,代码如下。
ublic class Chess { /** * 兵前进算法 * @param a 原位 * @param b 目标为 */ public void soldierGoAhead(int a, int b){ System.out.println("兵"+a+"进"+b); } /** * 炮前进算法 * @param a 原位 * @param b 目标为 */ public void gunGoAhead(int a, int b){ System.out.println("炮"+a+"进"+b); }
这样写可以吗?如果随着我们的算法不断增加,如马的行走规则,象的行走规则等等,那么这个象棋类就得不断的改,那岂不是在作死。
我们开始用策略模式来改写代码。
抽象的策略接口:
public interface Strategy { /** * 前进策略 * @param a 原位 * @param b 目标位 */ public void goAhead(int a, int b); /** * 平策略 * @param a 原位 * @param b 目标位 */ public void straight(int a, int b); }
实现炮的行走策略:
public class GunStrategy implements Strategy { /** * 炮前进策略 * @param a 原位 * @param b 目标位 */ @Override public void goAhead(int a, int b) { System.out.println("炮"+a+"进"+b); } /** * 炮平策略 * @param a 原位 * @param b 目标位 */ @Override public void straight(int a, int b) { System.out.println("炮"+a+"平"+b); } }
实现兵的行走策略:
public class SoldierStrategy implements Strategy { /** * 兵进策略 * @param a 原位 * @param b 目标位 */ @Override public void goAhead(int a, int b) { if(b-a==1){ System.out.println("兵"+a+"进"+b); }else { System.out.println("我是兵,我只能前进不能后退。"); } } /** * 兵平策略 * @param a 原位 * @param b 目标位 */ @Override public void straight(int a, int b) { if(b-a==1){ System.out.println("兵"+a+"平"+b); }else { System.out.println("我是兵,我只能平走一步"); } } }
测试:
public class ChessTest { public static void main(String[] args){ Chess chess = new Chess();//实例化象棋 chess.setStrategy(new GunStrategy());//接入炮的实现策略 chess.straight(5,8);//炮平走 chess.setStrategy(new SoldierStrategy());//接入兵的实现策略 chess.straight(5,8);//兵平走 chess.setStrategy(new SoldierStrategy());//接入兵的实现策略 chess.straight(5,6);//兵平走 } }
结果:
1 炮5平8
2 我是兵,我只能平走一步
3 兵5平6