设计模式之美—策略模式

简介: 设计模式之美—策略模式

策略模式

什么是策略模式

  策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化

策略模式是对算法的包装,是把使用算法的责任和算法本身分开。策略模式通常是把一系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。

例如下象棋时,炮的前进策略和马、兵的策略是不一样的,算法是有区别的。

我们开始实战,为了说明问题,我们以上图为例做一个超级简单的象棋(简单到没法玩象棋,嘿嘿),假设现在象棋只有炮、兵、将,代码如下。

 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

相关文章
|
1月前
|
设计模式 算法
设计模式之 Strategy(策略模式)
设计模式之 Strategy(策略模式)
30 1
|
1月前
|
设计模式 算法 PHP
php设计模式--策略模式(六)
php设计模式--策略模式(六)
20 0
|
1月前
|
设计模式 算法 搜索推荐
设计模式之策略模式
设计模式之策略模式
58 0
|
3天前
|
设计模式 算法 搜索推荐
Java设计模式之策略模式详解
Java设计模式之策略模式详解
|
4天前
|
设计模式 算法
策略模式-大话设计模式
策略模式-大话设计模式
6 0
|
1月前
|
设计模式 算法 Java
Java一分钟之-设计模式:策略模式与模板方法
【5月更文挑战第17天】本文介绍了策略模式和模板方法模式,两种行为设计模式用于处理算法变化和代码复用。策略模式封装不同算法,允许客户独立于具体策略进行选择,但需注意选择复杂度和过度设计。模板方法模式定义算法骨架,延迟部分步骤给子类实现,但过度抽象或滥用继承可能导致问题。代码示例展示了两种模式的应用。根据场景选择合适模式,以保持代码清晰和可维护。
31 1
|
1月前
|
设计模式 算法 Java
小谈设计模式(3)—策略模式
小谈设计模式(3)—策略模式
|
9天前
|
设计模式 算法
行为设计模式之策略模式
行为设计模式之策略模式
|
22天前
|
设计模式 算法 架构师
设计模式-策略模式详解
系统要求使用算法的客户不应该知道其操作的数据时,可使用策略模式来隐藏与算法相关的数据结构。
346 0
|
1月前
|
设计模式 算法
【设计模式】阿里终面:你觉得这个例子是策略模式吗?
【设计模式】阿里终面:你觉得这个例子是策略模式吗?
25 1