前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式二十四章经之策略模式

设计模式二十四章经之策略模式

作者头像
我就是马云飞
发布2018-06-22 17:40:48
2500
发布2018-06-22 17:40:48
举报
文章被收录于专栏:我就是马云飞我就是马云飞

今天有人看了我之前的推文,说我的作息不正常,我就这么被diss了。当然了,懂的人自然懂,不懂的人和他说到最后就是对喷。我也就懒得解释了,下面进入正文。

概述

策略模式在我们日常开发中也是经常遇见的。比如实现某一个功能有多种算法或者策略。我们根据具体情况去实现它。例如:排序算法,我们可以使用插入、冒泡、快排等等。

针对这种情况,我们一般将多个策略写在一个工具类中去方便调用。我们需要A策略就是调用A方法,需要B策略就调用B方法。

如果将这些算法或者策略抽象出来,变成一个接口,不同的策略有不同的实现类。这样我们就可以通过注入不同的对象去实现策略的动态替换,这种模式可扩展和可维护性都很高。

使用场景

1、针对同一类型的问题多种的处理方法。

2、需要安全的封装多种同一类型的操作时。

3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

具体实现

创建一个接口:

代码语言:javascript
复制
public interface Strategy {
   public int doOperation(int num1, int num2);
}

创建2个实体类去实现此接口:

代码语言:javascript
复制
public class OperationAdd implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 + num2;
   }
}
代码语言:javascript
复制
public class OperationSubstract implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 - num2;
   }
}

现在我们创建一个工具类:

代码语言:javascript
复制
public class Utils {
   private Strategy strategy;
   public Utils(Strategy strategy){
      this.strategy = strategy;
   }
   public int executeStrategy(int num1, int num2){
      return strategy.doOperation(num1, num2);
   }
}

最后我们在主函数中去实现:

代码语言:javascript
复制
public class Demo {
   public static void main(String[] args) {
      Utils utils = new Utils(new OperationAdd());        
      System.out.println("10 + 5 = " + utils.executeStrategy(10, 5));
      context = new Context(new OperationSubstract());        
      System.out.println("10 - 5 = " + utils.executeStrategy(10, 5));
   }
}

输出:

代码语言:javascript
复制
10 + 5 = 15
10 - 5 = 5

总结

策略模式主要用来分离算法,在相同的行为抽象下有不同的具体实现策略。这个模式很好的演示的开闭原则,也就是定义抽象,注入不同的实现,从而达到更好的可扩展性。

优点:

  • 结构清晰明了,使用简单直观
  • 耦合度相对而言较低,扩展方便
  • 操作封装更为彻底,数据安全

缺点:

  • 随着策略的增加,子类也会变得繁多。
  • 所有策略类都需要对外暴露。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我就是马云飞 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 使用场景
  • 具体实现
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档