设计模式之策略模式(Strategy Pattern)
- 什么是策略模式?
策略模式是23种经典是设计模式之一,它是一种行为型模式。也是我们非常常见的一种模式,它通常解决的是软件中多种算法之间的行为切换,通俗来讲,就是解决我们程序中多个if...else
、switch
的问题。 - 定义
策略模式(Strategy Pattern),定义了一系列的业务规则算法,并对其每个算法都进行封装,这一系列的业务规则算法之间可以相互替换。比如,我们最熟悉的Java中的Comparable比较器,只要实现该接口就可以对任何对象进行其比较。再比如,我们在支付业务中支付方式,我们可以使用微信、支付宝、银联等等支付方式进行支付的算法,税控发票业务中发票类型,我们可以选择开普通税控发票、电子发票等等开票方式进行开票的业务算法等。都可以用到策略模式。 - 结构
通过继承的方式将不同的算法封装在不同的实现类中。如下图所示:
- 优点
- 算法之间可以自由切换
- 避免使用大量的
if...else
、switch
判断 - 扩展性好,增加一个策略只要实现该策略接口即可
- 缺点
- 因为每种策略是一个类,我们每增加一种策略即就要增加一个类,这样可以能会造成类的数量过多(类过载,维护困难),并且复用的可能性很小(复用性差),并且所有的策略类都要对外进行暴露(安全性差)
。
- 因为每种策略是一个类,我们每增加一种策略即就要增加一个类,这样可以能会造成类的数量过多(类过载,维护困难),并且复用的可能性很小(复用性差),并且所有的策略类都要对外进行暴露(安全性差)
- 适用场景
- 假如系统中有很逻辑判断,而他们的区别仅仅区别于算法业务逻辑实现等行为不同。
- 一个系统需要动态地在几种算法中选择一种。
- 需要屏蔽算法规则。
- 策略模式的实现
这里我用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)相关推荐
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式- Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- 二十四种设计模式:策略模式(Strategy Pattern)
策略模式(Strategy Pattern) 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操 ...
- 锈才学设计模式之 —— 策略模式(Strategy Pattern)
锈才学设计模式之 -- 策略模式 策略模式:把功能提供者单独封装成类,使它们可以互相替换使用,让功能提供者独立于使用者(调用者). 说明: 在面向对象编程中,我们尽量将功能(类)设计成复用,以符合O ...
- 设计模式实战-策略模式(Strategy Pattern)
0 联系我 图片标题 1.Q群[Java开发技术交流]:jq.qq.com/?_wv=1027&a- 2.完整博客链接:www.shishusheng.com 3.知乎:www.zhihu.c ...
- 解读设计模式----策略模式(Strategy Pattern)
一.模式概述 策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法. 在我应 ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了"工厂模式"."策略模式" ...
- 关于设计模式——策略模式-Strategy Pattern
文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...
- 设计模式——策略模式( Strategy Pattern )
写代码超过千行,自定义类10个以上,往往写着写着就觉的乱,最终决定抽空补习下设计模式方面的知识.本来AS3出了本关于设计模式的书的,国人也翻译了.我同事也早早买了一本,但前些天我借来看了几页,翻译的太 ...
- 设计模式-策略模式(Strategy Pattern)
Define a family of algorithms,encapsulate each one,and make them interchangeable(定义一组算法,将每个算法都封装起来,并 ...
- 设计模式之策略模式(Strategy)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
最新文章
- Linux上chown命令的高级用法
- 设计模式C#实现(三)——外观模式
- 【Visual C++】游戏开发笔记十四 游戏画面绘图(四) 华丽的CImage类
- 卷机神经网络的可视化(可视化中间激活)
- fastadmin html模板,fastadmin 使用记录
- php 自动分配数据到个人,数据表格自动分配列宽的一种实现方法
- 微软商店 错误代码0x80073CF9
- 如何查看oracle客户端的版本,如何查看Oracle客户端版本
- SOLIDWORKS教程:solidworks设计绘图的七大实用技巧
- 支付宝第三方应用,用户登录授权获取信息
- 暗影崛起 黑石山 英雄难度 科林酒吧
- 【Tools系列】OneNote 2016 中同步笔记时出现0xE4010640错误
- 浏览器标准模式和怪异模式之间的区别是什么
- 单片机c语言编写注解,单片机C语言程序注解
- word里如何在□里打√!框框里打勾!!!!!
- LED驱动芯片TM1668驱动代码
- 打开word文档提示文件未找到_word文档打开,提示“向程序发送命令时出现问题”的原因...
- c语言十六转十进制,C语言 · 十六进制转十进制
- 发现一个Intellij IDEA好看的字体,内容引起极度舒适
- DBHelper、DataHelper、ADO数据库操作类(转)
热门文章
- iOS - 获取设备标识符UUID/UDID/IMEI等
- JavaScript实现模态对话框
- 旧版RTSP协议网页视频无插件直播EasyNVR视频平台为什么无法播放H264编码视频?
- 蜜芽创始人刘楠:消费降级正发生,创业公司能从“四个打法”突破
- 【Ubuntu18.04离线安装网卡驱动】自带r8169安装r8125有线网卡驱动
- 低成本盈利的重要项目你知道哪7个吗?适合新手上手容易
- mysql 悲观锁 性能_mysql的乐观锁和悲观锁
- 计算机专业买什么商务本好,单位购买什么笔记本的比较多?各位能不能说来听听?华硕笔记本电脑哪个系列性价好,商务办公用?...
- python笔记-2020/09/03下午-字符串练习(5)
- 目标检测之Loss:FasterRCNN中的SmoothL1Loss