• 什么是策略模式?
    策略模式是23种经典是设计模式之一,它是一种行为型模式。也是我们非常常见的一种模式,它通常解决的是软件中多种算法之间的行为切换,通俗来讲,就是解决我们程序中多个if...elseswitch的问题。
  • 定义
    策略模式(Strategy Pattern),定义了一系列的业务规则算法,并对其每个算法都进行封装,这一系列的业务规则算法之间可以相互替换。比如,我们最熟悉的Java中的Comparable比较器,只要实现该接口就可以对任何对象进行其比较。再比如,我们在支付业务中支付方式,我们可以使用微信、支付宝、银联等等支付方式进行支付的算法,税控发票业务中发票类型,我们可以选择开普通税控发票、电子发票等等开票方式进行开票的业务算法等。都可以用到策略模式。
  • 结构
    通过继承的方式将不同的算法封装在不同的实现类中。如下图所示:
  • 优点
    • 算法之间可以自由切换
    • 避免使用大量的if...elseswitch判断
    • 扩展性好,增加一个策略只要实现该策略接口即可
  • 缺点
    • 因为每种策略是一个类,我们每增加一种策略即就要增加一个类,这样可以能会造成类的数量过多(类过载,维护困难),并且复用的可能性很小(复用性差),并且所有的策略类都要对外进行暴露(安全性差)
  • 适用场景
    • 假如系统中有很逻辑判断,而他们的区别仅仅区别于算法业务逻辑实现等行为不同。
    • 一个系统需要动态地在几种算法中选择一种。
    • 需要屏蔽算法规则。
  • 策略模式的实现

这里我用Comparator比较器的场景,来进行举例:

  • Comparator(比较器)

这里我想分别比较Dog的大小以及Cat的大小
首先要先有Dog和Cat的实体类

/*** 狗*/
public class Dog implements Comparable<Dog> {int food;public Dog(int food) {this.food = food;}@Overridepublic String toString() {return "Dog{" +"food=" + food +'}';}
}
/*** 猫*/
public class Cat implements Comparable<Cat>{int weight,height;public Cat(int weight, int height) {this.weight = weight;this.height = height;}@Overridepublic String toString() {return "Cat{" +"weight=" + weight +", height=" + height +'}';}
}

定义一个比较器的接口

/*** 自定义Comparable接口用于实现排序*/
public interface Comparable<T> {/*** 比较方法* @param t*/int compareTo(T t);
}

比较Dog的大小,定义比较狗的比较器 并实现Comparator接口泛型传入Dog对象

/*** 比较狗的大小*/
public class DogComparator implements Comparator<Dog> {@Overridepublic int compare(Dog o1, Dog o2) {if(o1.food >  o2.food) return 1;else if(o1.food <  o2.food) return -1;else return 0;}

根据width比较Cat的大小,定义比较狗的比较器 并实现Comparator接口泛型传入Cat对象

/*** 根据宽度比较猫的大小*/
public class CatWidthComparator implements Comparator<Cat> {@Overridepublic int compare(Cat o1, Cat o2) {if(o1.weight >  o2.weight) return 1;else if(o1.weight <  o2.weight) return -1;else return 0;}
}

根据height 比较Cat的大小,定义比较狗的比较器 并实现Comparator接口泛型传入Cat对象

/*** 根据高度进行比较猫的大小*/
public class CatHeightComparator implements Comparator<Cat> {@Overridepublic int compare(Cat o1, Cat o2) {if(o1.height >  o2.height) return 1;else if(o1.height <  o2.height) return -1;else return 0;}
}

比较排序

/*** 排序方法*/
public class Sorter<T> {public void sort(T[] arr,Comparator<T> comparator) {for (int i = 0; i < arr.length; i++) {int minPos = i;for (int j = i + 1; j < arr.length; j++) {minPos = comparator.compare(arr[j],arr[minPos]) == -1 ? j :minPos;}//调用排序规则this.swap(arr,i,minPos);}}/*** 排序规则* @param arr* @param i* @param j*/private void swap(T[] arr, int i, int j) {T temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}

测试案例

/*** 策略模式测试案例*/
public class Main {public static void main(String[] args) {Cat[] cats = {new Cat(3,5),new Cat(1,2),new Cat(5,6)};Dog[] dogs = {new Dog(3),new Dog(1),new Dog(5)};//jdk中的比较器/* sorter.sort(a, (o1,o2)->{if(o1.food < o2.food) return -1;else if(o1.food > o2.food) return 1;return 0;});*///对狗进行排序Sorter<Dog> sorter = new Sorter();sorter.sort(dogs,new DogComparator());System.out.println(Arrays.toString(dogs));//对猫按照宽度进行排序Sorter<Cat> catSorter = new Sorter();catSorter.sort(cats,new CatWidthComparator());System.out.println(Arrays.toString(cats));//对猫按照高度进行排序catSorter.sort(cats,new CatHeightComparator());System.out.println(Arrays.toString(cats));     }
  • UML类图
  • 总结
    策略模式实质就是封装了一些算法,让算法可以互相替换,用户可以自由选择这些算法进行操作。

设计模式之策略模式(Strategy Pattern)相关推荐

  1. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式- Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  2. 二十四种设计模式:策略模式(Strategy Pattern)

    策略模式(Strategy Pattern) 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操 ...

  3. 锈才学设计模式之 —— 策略模式(Strategy Pattern)

    锈才学设计模式之  -- 策略模式 策略模式:把功能提供者单独封装成类,使它们可以互相替换使用,让功能提供者独立于使用者(调用者). 说明: 在面向对象编程中,我们尽量将功能(类)设计成复用,以符合O ...

  4. 设计模式实战-策略模式(Strategy Pattern)

    0 联系我 图片标题 1.Q群[Java开发技术交流]:jq.qq.com/?_wv=1027&a- 2.完整博客链接:www.shishusheng.com 3.知乎:www.zhihu.c ...

  5. 解读设计模式----策略模式(Strategy Pattern)

    一.模式概述      策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法.       在我应 ...

  6. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了"工厂模式"."策略模式" ...

  7. 关于设计模式——策略模式-Strategy Pattern

    文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...

  8. 设计模式——策略模式( Strategy Pattern )

    写代码超过千行,自定义类10个以上,往往写着写着就觉的乱,最终决定抽空补习下设计模式方面的知识.本来AS3出了本关于设计模式的书的,国人也翻译了.我同事也早早买了一本,但前些天我借来看了几页,翻译的太 ...

  9. 设计模式-策略模式(Strategy Pattern)

    Define a family of algorithms,encapsulate each one,and make them interchangeable(定义一组算法,将每个算法都封装起来,并 ...

  10. 设计模式之策略模式(Strategy)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

最新文章

  1. Linux上chown命令的高级用法
  2. 设计模式C#实现(三)——外观模式
  3. 【Visual C++】游戏开发笔记十四 游戏画面绘图(四) 华丽的CImage类
  4. 卷机神经网络的可视化(可视化中间激活)
  5. fastadmin html模板,fastadmin 使用记录
  6. php 自动分配数据到个人,数据表格自动分配列宽的一种实现方法
  7. 微软商店 错误代码0x80073CF9
  8. 如何查看oracle客户端的版本,如何查看Oracle客户端版本
  9. SOLIDWORKS教程:solidworks设计绘图的七大实用技巧
  10. 支付宝第三方应用,用户登录授权获取信息
  11. 暗影崛起 黑石山 英雄难度 科林酒吧
  12. 【Tools系列】OneNote 2016 中同步笔记时出现0xE4010640错误
  13. 浏览器标准模式和怪异模式之间的区别是什么
  14. 单片机c语言编写注解,单片机C语言程序注解
  15. word里如何在□里打√!框框里打勾!!!!!
  16. LED驱动芯片TM1668驱动代码
  17. 打开word文档提示文件未找到_word文档打开,提示“向程序发送命令时出现问题”的原因...
  18. c语言十六转十进制,C语言 · 十六进制转十进制
  19. 发现一个Intellij IDEA好看的字体,内容引起极度舒适
  20. DBHelper、DataHelper、ADO数据库操作类(转)

热门文章

  1. iOS - 获取设备标识符UUID/UDID/IMEI等
  2. JavaScript实现模态对话框
  3. 旧版RTSP协议网页视频无插件直播EasyNVR视频平台为什么无法播放H264编码视频?
  4. 蜜芽创始人刘楠:消费降级正发生,创业公司能从“四个打法”突破
  5. 【Ubuntu18.04离线安装网卡驱动】自带r8169安装r8125有线网卡驱动
  6. 低成本盈利的重要项目你知道哪7个吗?适合新手上手容易
  7. mysql 悲观锁 性能_mysql的乐观锁和悲观锁
  8. 计算机专业买什么商务本好,单位购买什么笔记本的比较多?各位能不能说来听听?华硕笔记本电脑哪个系列性价好,商务办公用?...
  9. python笔记-2020/09/03下午-字符串练习(5)
  10. 目标检测之Loss:FasterRCNN中的SmoothL1Loss