设计模式学习[2]---策略模式+简单工厂回顾

news2024/11/27 5:26:33

文章目录

  • 前言
  • 1.简单工厂模式回顾
  • 2.策略模式
  • 3.策略模式+简单工厂的结合
  • 总结

前言

上一篇讲到简单工厂模式。
在我的理解中工厂的存在就是,为了实例化对象。根据不同条件实例化不同的对象的作用。
这篇博客写的策略模式,可以说是把这个根据不同情况实例化不同对象的这个过程再一次封装了。简而言之就是,策略模式对变化进行了封装。
有点迷。且听我娓娓道来。

1.简单工厂模式回顾

上一节我们画了一个这样的类图。

在这里插入图片描述
客户如果想操作导出,其实需要知道两个类的对象。
一个是操作的接口类 E x p o r t O p e r a t i o n ExportOperation ExportOperation,另一个是 E x p o r t F a c t o r y ExportFactory ExportFactory
前者是为了执行导出操作,后者是为这个类的对象指针实例化特定类型的对象。

2.策略模式

导出可以分为文本导出和图片导出,这种分类的情况其实就是算一种策略。

我们这里区分文本和图片导出,是通过导出工厂ExportFactory的函数去创建对象。这个调用函数创建对象的操作是显式的调用的;同时创建完对象之后,再由导出操作去调用导出操作。这么做简单举例是可以,如果更加合理一些的话,应该是有一个对象去调用这个导出操作吧?而不是导出操作自己去调用导出。

所以这里应该还需要一个类,它有导出的一些操作。同时创建导出对象的过程是显式调用,也就是用户要知道我有这个工厂类,要知道有这么个函数,才可以使用。这样是不是就麻烦了呢?

前言部分我说,策略模式是对变化进行了封装。也就是说,策略模式的效果能够做到这个创建对象的过程隐藏掉了,对于用户来说不管什么工厂之类的了。那么再结合一下刚才说的,应该有一个类去调用导出操作,我们画一个新的类图。

3.策略模式+简单工厂的结合

在这里插入图片描述

在这个类图中,Context表示文本,我们可以在Context初始化的时候传递一个字符串,再根据字符串实例化对应的导出操作对象。
这样是不是就相当于把工厂类隐藏了,同时让Context类的成员变量m_pExOp去调用exportData即可。

#include<iostream>
using namespace std;
class ExportOperation
{
public:
	virtual void exportData() {};
};
class ExportText :public ExportOperation
{
public:
	void exportData() override;
};
class ExportImage :public ExportOperation
{
public:
	void exportData() override;
};
enum OperationType
{
	text = 1,
	image
};

class Context
{
public:
	Context() {};
	Context(OperationType type)
	{		
		switch (type)
		{
		case text:
		{
			m_pExOP = new ExportText();
			break;
		}
		case image:
		{
			m_pExOP = new ExportImage();
			break;
		}
		default:
			break;
		}
	}
	void ExportData()
	{
		m_pExOP->exportData();
	}

private:

	ExportOperation* m_pExOP{ nullptr };

};
int main()
{
	Context* m_pContext=new Context(OperationType::image);
	m_pContext->ExportData();
	return 0;
}

总结

在看策略模式的时候,我其实挺奇怪它和简单工厂有什么区别。因为看书中的代码感觉变化不是很大。
后来仔细对比了一下发现:
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

我的例子中,都是导出这个工作,导出文本算一种算法,导出图片又是另一种算法。但是他们其实都是通过导出这个操作去调用,这就减少了减少了各种算法类(导出文本)与使用算法类(导出操作)之间的耦合。同时,针对导出文本这种算法,我们可以单独测试,并不会影响其他的算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1941075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pdf2docx - pdf 提取内容转 docx

文章目录 一、关于 pdf2docx主要功能限制 二、安装1、 PyPI2、从remote安装3、从源码安装4、卸载 三、转化 PDF例 1: convert all pages例 2: 转换指定页面例 3: multi-Processing例 4: 转换加密的pdf 四、提取表格五、命令行交互1、按页面范围2、按页码3、Multi-Processing 六…

使用Vue.js集成百度地图WebGL实现3D地图应用

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用Vue.js集成百度地图WebGL实现3D地图应用 应用场景介绍 本代码用于在Vue.js应用程序中集成百度地图WebGL&#xff0c;实现3D地图的可视化展示。它可以应用于各种场景&#xff0c;例如&#xff1a; 城市规…

助燃新质生产力,魔珐科技亮相IMC2024制造业数字科技大会展示有言AIGC视频工具价值

2024年7月19日&#xff0c;IMC2024第八届制造业数字科技大会在上海盛大开幕&#xff0c;本次大会以《向“智”而行》为主题&#xff0c;250智能制造行业数字化转型企业、行业领军者及实践者共聚一堂&#xff0c;共同助力企业增强技术“硬核力”&#xff0c;为新质生产力蓄势赋能…

【SpringBoot3】全局异常处理

【SpringBoot3】全局异常处理 一、全局异常处理器step1&#xff1a;创建收入数字的页面step2:创建控制器&#xff0c;计算两个整数相除step3:创建自定义异常处理器step5&#xff1a;创建给用提示的页面step6&#xff1a;测试输入&#xff08;10/0&#xff09; 二、BeanValidato…

TCP/IP网络模型详解

在计算机网络领域&#xff0c;网络模型通常指的是 OSI&#xff08;Open Systems Interconnection&#xff09;参考模型或 TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;模型。这些模型描述了网络中数据传输的层次结构&#xff0c;便于理解和…

ROS2从入门到精通2-3:详解机器人3D物理仿真Gazebo与案例分析

目录 0 专栏介绍1 什么是Gazebo?2 Gazebo架构2.1 Gazebo前后端2.2 Gazebo文件格式2.3 Gazebo环境变量3 Gazebo安装与基本界面4 搭建自己的地图4.1 编辑地图4.2 保存地图4.3 加载地图5 常见问题0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有…

【面试八股文】计算机操作系统

参考&#xff1a;大佬图解文章 → 小林coding 简介&#xff1a;之前在学习小林大佬的八股文时&#xff0c;摘录了一些个人认为比较重要的内容&#xff0c;方便后续自己复习。【持续更新ing ~&#x1f4af;】 注&#xff1a;加五角星标注的&#xff0c;是当前掌握不牢固的&…

WEB攻防-通用漏洞-SQL注入-MYSQL-union一般注入

前置知识 MySQL5.0以后存放一个默认数据库information_schemaschemata表存放该用户创建的所有库名&#xff0c;schemata. schema_name字段存放库名tables表存放该用户创建的所有库名和表明&#xff0c;tables.table_schema字段存放库名&#xff0c;tables.table_name存放表名co…

Elastic 及阿里云 AI 搜索 Tech Day 将于 7 月 27 日在上海举办

活动主题 面向开发者的 AI 搜索相关技术分享&#xff0c;如 RAG、多模态搜索、向量检索等。 活动介绍 参加 Elastic 原厂与阿里云联合举办的 Generative AI 技术交流分享日。借助 The Elastic Search AI Platform&#xff0c; 使用开放且灵活的企业解决方案&#xff0c;以前所…

基于YOLO8的目标检测系统:开启智能视觉识别之旅

文章目录 在线体验快速开始一、项目介绍篇1.1 YOLO81.2 ultralytics1.3 模块介绍1.3.1 scan_task1.3.2 scan_taskflow.py1.3.3 target_dec_app.py 二、核心代码介绍篇2.1 target_dec_app.py2.2 scan_taskflow.py 三、结语 在线体验 基于YOLO8的目标检测系统 基于opencv的摄像头…

Spring Cloud GateWay(4.1.4)

介绍 该项目提供了一个建立在 Spring 生态系统之上的 API 网关&#xff0c;包括&#xff1a;Spring 6、Spring Boot 3 和 Project Reactor。Spring Cloud Gateway 旨在提供一种简单而有效的方法来路由到 API&#xff0c;并为其提供跨领域关注点&#xff0c;例如&#xff1a;安…

华清数据结构day3 24-7-18

基于昨天代码增加增删改查功能 zy.h #ifndef ZY_H #define ZY_H #define MAX 100 //最大容量 //定义学生类型 struct Stu {char name[20];int age;double score; }; //定义班级类型 struct Class {struct Stu student[MAX]; //存放学生的容器int size; //实际…

【Git】(基础篇五)—— Git进阶

Git进阶 之前关于本地和远程仓库的各种操作都已经非常基础了&#xff0c;本文介绍git的一些进阶使用和设置 用户名和邮箱 之前介绍的每一次提交(commit) 都会产生一条日志(log) 信息&#xff0c;这条日志信息不仅会记录提交信息&#xff0c;还会记录执行提交操作的这个用户的…

【QAC】分布式部署下其他机器如何连接RLM

1、 文档目标 解决分布式部署下其他机器如何连接RLMLicense管理器。 2、 问题场景 分布式部署下QAC要在其他机器上单独运行扫描&#xff0c;必须先连接RLMLicense管理器&#xff0c;如何连接&#xff1f; 3、软硬件环境 1、软件版本&#xff1a;HelixQAC23.04 2、机器环境…

ClusterIP、NodePort、LoadBalancer 和 ExternalName

Service 定义 在 Kubernetes 中&#xff0c;由于Pod 是有生命周期的&#xff0c;如果 Pod 重启它的 IP 可能会发生变化以及升级的时候会重建 Pod&#xff0c;我们需要 Service 服务去动态的关联这些 Pod 的 IP 和端口&#xff0c;从而使我们前端用户访问不受后端变更的干扰。 …

SpringBoot Security OAuth2实现单点登录SSO(附源码)

文章目录 基础概念1. 用户认证2. 单点登录&#xff08;SSO&#xff09;3. 授权管理4. 安全性和配置 逻辑实现配置认证服务器配置Spring Security两个客户端 页面展示本篇小结 更多相关内容可查看 附源码地址&#xff1a;https://gitee.com/its-a-little-bad/SSO.git 基础概念 …

HarmonyOS 状态管理(一)

1. HarmonyOS 状态管理 1.1. 说明 官方文档&#xff08;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-state-management-V5&#xff09; 1.1.1. 状态管理&#xff08;V1稳定版&#xff09; 状态管理&#xff08;V1稳定版&#xff09;提供了多种…

90+ Python 面试问答(2024 版)

90+ Python 面试问答(2024 版) 一、介绍 欢迎来到准备数据科学工作面试的第一步。这里有一个全面而广泛的 Python 面试问题和答案列表,可帮助您在面试中取得好成绩并获得理想的工作!Python 是一种解释型通用编程语言,由于其在人工智能 (AI) 中的使用,如今需求量很大。…

python大小写转换、驼峰大小写转换

一 大小写转换 1第1个单词的首字母大写 capitalize() 2每个单词的首字母大写 title() 3所有字母大小写转换 swapcase() 代码示例 texttoday is sundaYprint(text.capitalize()) # 仅第1个单词的首字母大写 print(text.title()) # 每个单词的首字母大写 print(text.swapcase…

Vue 多选下拉框+下拉框列表中增加标签

1、效果图 2、代码部分 &#xff08;1&#xff09;代码 <el-select class"common-dialog-multiple multipleSelectStyle" change"clusterListChange" v-model"form.clusterId" placeholder"请先选择" multiple filterable defaul…