策略模式
什么是策略模式
策略模式的用意是针对一组算法, 将每一个算法封装到具有共同接口的独立类中, 从而使得它们可以相互替换. 策略模式使得算法可以在不影响到客户端的情况下发生变化
策略模式是对算法的包装, 是把使用算法的责任和算法本身分开. 策略模式通常是把一系列的算法包装到一系列的策略类里面, 作为一个抽象策略类的子类.
例如下象棋时, 炮的前进策略和马, 兵的策略是不一样的, 算法是有区别的.
我们开始实战, 为了说明问题, 我们以上图为例做一个超级简单的象棋 (简单到没法玩象棋, 嘿嘿), 假设现在象棋只有炮, 兵, 将, 代码如下.
- public 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);// 兵平走
- }
- }
结果:
炮 5 平 8
我是兵, 我只能平走一步
兵 5 平 6
posted on 2019-10-16 17:09 夜深思 阅读 (...) 评论 (...) 编辑 收藏
来源: https://www.cnblogs.com/yeshensi/p/11684532.html