当前位置: 首页 > news >正文

策略模式的一次应用

项目的需求是将一组图像按照相似度分类。
采用了模板匹配计算相似度的实现方式。

#include <opencv2/core.hpp>
#include <openev2/core/utility.hpp>
#include <opencv2/highqui.hpp>
#include <openav2/imgproc.hpp>

cv::Mat image matched;
double value;
cv::matchTemplate (image_a, image_b, image_matched, cv::TM CCORR NORMED); cv::minMaxLoc(image_matched, 0, &value, 0, 0);

value的值表示相似度的大小。

这一方案完成后,紧接着又一个需求:使用距离算法作为相似度算法。
而且后面还会有新的算法。
此时,就考虑使用策略模式了。
如果后面没有新需求,仍不需要考虑使用,以避免重构代码带来的时间成本。

使用这一模式后,每一种相似度算法不再是孤立的,而是成了有一个共同父类的兄弟类。
相似度的计算函数calculate()作为父类的纯虚函数,
每个子类用不同的算法实现这一函数。
caller使用父类指针调用函数calculate()。
通过多态机制调用具体子类的函数calculate()。

为什么会选择这一设计模式呢?
使用这一方法后,代码便符合了依赖倒置原则,
依赖于抽象,而不是依赖于具体的实现。
代码将非常有利于扩展,新增一个算法,只需继承父类,并实现纯虚函数。
在caller中使用一个简单工厂在堆中创建子类对象,
每新增一个算法,就在简单工厂中创建出一个新的子类对象。
caller便可以使用新算法了。
节省了开发时间,也节省了测试时间,不用担心先前测试过的算法被新的算法影响。

uml图如下:
在这里插入图片描述

http://www.lryc.cn/news/415015.html

相关文章:

  • 探索PyCharm的C/C++支持:一站式配置指南
  • 手机三要素接口怎么对接呢?(一)
  • 状态同步帧同步
  • Flink 开发语言选择 —— Java vs Scala
  • 如何在 Apache Web 服务器中安装、配置和使用模块
  • 海信聚好看的DBDocter软件使用心得
  • dfs深搜
  • 【React】详解 index.js 文件
  • Android NDK/JNI面试题大全及参考答案(3万字长文)
  • 从根儿上学习spring一 之杂谈
  • AI智能名片小程序在促销性内容营销中的创新应用与策略分析
  • 13. 罗马数字转整数【 力扣(LeetCode) 】
  • 0CTF/TCTF 2023 OLAPInfra Nashorn RCE + HDFS UDF RCE
  • Studying-代码随想录训练营day56| 108.冗余连接、109.冗余连接II
  • 基于springboot+vue+uniapp的智慧物业平台小程序
  • MATLAB霍夫曼表盘识别系统
  • Python | Leetcode Python题解之第322题零钱兑换
  • python中类class的魔法方法
  • 计算机体系结构和计算机组成原理的区别
  • MySQL--数据库备份
  • influxDB的常用命令
  • 使用 1panel面板 部署 springboot 和 vue
  • 快速体验LLaMA-Factory 私有化部署和高效微调Llama3模型(曙光超算互联网平台异构加速卡DCU)
  • Cocos Creator 3.8.x bundle设置最佳方案
  • 【论文笔记】4D Millimeter-Wave Radar in Autonomous Driving: A Survey
  • 搭建 Rancher 服务,配置k8s集群
  • 数据恢复的定制之旅:打造SQL Server的专属恢复方案
  • Javascript常见算法详解
  • MySQL数据管理 - 查询语句
  • 经典图论算法回顾之Bellman-Ford算法