`
onlyor
  • 浏览: 377377 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

策略模式

阅读更多

 

概念

策略模式(Strategy):它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)

 

策略模式图

 

优点:

  1 简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
  2 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
       3 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。

缺点:
  1  因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。
       2  在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。(这本身没有解除客户端需要选择判断的压力,而策略模式与简单工厂模式结合后,选择具体实现的职责也可以由Context来承担,这就最大化的减轻了客户端的压力。)

 

策略模式的组成

  —抽象策略角色: 策略类,通常由一个接口或者抽象类实现。

  —具体策略角色:包装了相关的算法和行为。

—环境角色:持有一个策略类的引用,最终给客户端调用。

 

 

抽象策略角色

 

/**
* 首先定一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口
*/
public interface IStrategy {
   //每个锦囊妙计都是一个可执行的算法
   public void operate();
}
 


 

具体策略角色---三个锦囊(通过封装,将算法和行为给包起来,就是高内聚 )

 

/**
* I'm glad to share my knowledge with you all.
* 找乔国老帮忙,使孙权不能杀刘备
*/
public class BackDoor implements IStrategy {
   public void operate() {
      System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
   }
}

/**
* I'm glad to share my knowledge with you all.
* 求吴国太开个绿灯
*/
public class GivenGreenLight implements IStrategy {
   public void operate() {
      System.out.println("求吴国太开个绿灯,放行!");
   }
}

/**
* I'm glad to share my knowledge with you all.
* 孙夫人断后,挡住追兵
*/
public class BlockEnemy implements IStrategy {
   public void operate() {
      System.out.println("孙夫人断后,挡住追兵");
   }
}
 

 

环境角色,给客户用,将具体实现细节与用户隔开,实现彼此独立、低耦合

 

/**
* I'm glad to share my knowledge with you all.
* 计谋有了,那还要有锦囊
*/
public class Context {
   //构造函数,你要使用那个妙计
   private IStrategy straegy;

   public Context(IStrategy strategy){
      this.straegy = strategy;
   }

   //使用计谋了,看我出招了
   public void operate(){
      this.straegy.operate();
   }

}
 

用户实例

 

// 用户实例
public class ZhaoYun {

   /**
   * 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
   */
   public static void main(String[] args) {
      // 环境
      Context context;

      //刚刚到吴国的时候拆第一个
      System.out.println("------刚刚到吴国的时候拆第一个-----");
      context = new Context(new BackDoor()); //拿到妙计
      context.operate(); //拆开执行
      System.out.println("\n\n\n\n\n\n\n\n");


      //刘备乐不思蜀了,拆第二个了
      System.out.println("----刘备乐不思蜀了,拆第二个了---");
      context = new Context(new GivenGreenLight());
      context.operate(); //执行了第二个锦囊了
      System.out.println("\n\n\n\n\n\n\n\n");

      //孙权的小兵追了,咋办?拆第三个
      System.out.println("----孙权的小兵追了,咋办?拆第三个----");
      context = new Context(new BlockEnemy());
      context.operate(); //孙夫人退兵
      System.out.println("\n\n\n\n\n\n\n\n");
   }

}
 

  

本文摘自《24种设计模式介绍与6大设计原则》

----------------------------------------------------------------------------------------------------------------------------------------------------

以上是摘抄lcy0202的,并结合cnblogs的集采文章,这个例子可深入浅出的描述出策略模式的思想!

 

 

  • 大小: 4.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics