行为模式---访问者模式

devtools/2025/3/18 14:57:23/

概念

访问者模式是设计模式行为模式的一种,主要是用于将算法和所作用的对象隔离开来。

访问者模式通过将算法封装在访问者对象中,使得算法可以独立于对象结构变化。对象结构中的每个元素都接受访问者对象,并将自身传递给访问者对象,从而执行操作。

适用场景

1、如果需要对一个复杂结构进行所有元素进行操作,而又不想去修改原始结构的时候,可以使用访问者模式

2、如果在所作用的对象添加一些附加操作,而不能去修改所作用的对象结构的时候,可以使用访问者模式

3、当一些行为在类的层次结构中的一些类有意义,而对于其他类没有意义的时候,可以使用此模式。

创建方式

1、创建一个访问者类,在此类中实现一系列的操作函数。

2、在被操作类中添加一个接口,用于接受访问者对象,并通过访问者对象去调用访问者的操作函数。

3、在客户端使用的时候创建访问者,并将访问者通过参数传递给被操作的类中。进行调用。

类关系图

在这里插入图片描述

示例代码

#include "FangWenZheMoShi.h"
int main()
{std::cout << "欢迎东哥来到设计模式的世界!\n";//创建访问者类对象VisitorInterFace* vistior1 = new ConcreteViritor1();VisitorInterFace* vistior2 = new ConcreteViritor2();//创建元素对象ConcreteItem1* item1 = new ConcreteItem1();item1->setVisitor(vistior1);item1->callVisitor();item1->setVisitor(vistior2);item1->callVisitor();cout << "==========================" << endl;ConcreteItem2* item2 = new ConcreteItem2();item2->setVisitor(vistior1);item2->callVisitor();item2->setVisitor(vistior2);item2->callVisitor();
}
#pragma once
#include <iostream>
#include <string>using namespace std;//访问者接口类
class VisitorInterFace
{
public:VisitorInterFace() {}~VisitorInterFace() {}virtual void handle1() {}virtual void handle2() {}string name;};//元素接口类
class FItemInterface
{
public:FItemInterface() {}~FItemInterface() {}VisitorInterFace* m_visitor;virtual void setVisitor(VisitorInterFace* visitor) {m_visitor = visitor;}
};//具体访问者类1
class ConcreteViritor1 : public VisitorInterFace {
public:ConcreteViritor1() {name = "ConcreteViritor1";}~ConcreteViritor1() {}void handle1() {cout << "具体访问者1 ConcreteViritor1 的 handle1 函数" << endl;}void handle2() {cout << "具体访问者1 ConcreteViritor1 的 handle2 函数" << endl;}
};//具体访问者类2
class ConcreteViritor2 : public VisitorInterFace {
public:ConcreteViritor2() {name = "ConcreteViritor2";}~ConcreteViritor2() {}void handle1() {cout << "具体访问者1 ConcreteViritor2 的 handle1 函数" << endl;}void handle2() {cout << "具体访问者1 ConcreteViritor2 的 handle2 函数" << endl;}
};//具体的元素类
class ConcreteItem1 : public FItemInterface {
public:ConcreteItem1() {}~ConcreteItem1() {}void setVisitor(VisitorInterFace* visitor) {m_visitor = visitor;}void callVisitor() {if (m_visitor) {cout << "具体元素类1 ConcreteItem1 调用 "<< m_visitor->name << " 的handle1 函数" << endl;m_visitor->handle1();}}
};//具体的元素类
class ConcreteItem2 : public FItemInterface {
public:ConcreteItem2() {}~ConcreteItem2() {}void setVisitor(VisitorInterFace* visitor) {m_visitor = visitor;}void callVisitor() {if (m_visitor) {m_visitor->handle2();cout << "具体元素类1 ConcreteItem2 调用 " << m_visitor->name << " 的handle2 函数" << endl;}}
};
欢迎东哥来到设计模式的世界!
具体元素类1 ConcreteItem1 调用 ConcreteViritor1 的handle1 函数
具体访问者1 ConcreteViritor1 的 handle1 函数
具体元素类1 ConcreteItem1 调用 ConcreteViritor2 的handle1 函数
具体访问者1 ConcreteViritor2 的 handle1 函数
==========================
具体访问者1 ConcreteViritor1 的 handle2 函数
具体元素类1 ConcreteItem2 调用 ConcreteViritor1 的handle2 函数
具体访问者1 ConcreteViritor2 的 handle2 函数
具体元素类1 ConcreteItem2 调用 ConcreteViritor2 的handle2 函数

http://www.ppmy.cn/devtools/168083.html

相关文章

一般机器学习有哪些算法?

传统的机器学习算法主要依赖统计学和优化方法&#xff0c;不依赖深层神经网络&#xff0c;通常具有较高的可解释性且适用于中小规模数据集。以下是经典的传统机器学习算法分类及代表性模型&#xff1a; 一、监督学习&#xff08;Supervised Learning&#xff09; 1. 回归&…

Muon: An optimizer for hidden layers in neural networks

引言 在深度学习领域&#xff0c;优化算法对模型训练效率和性能起着关键作用。从经典的随机梯度下降 (SGD) 及其动量法&#xff0c;到自适应优化方法 Adam/AdamW 等&#xff0c;一系列优化器大大加速了神经网络的收敛。然而&#xff0c;随着模型规模和数据量的爆炸式增长&…

第一节:关于数组的算法(python版)

目录 一、存储方式 二、二分查找 三&#xff1a;数组的算法操作&#xff1a;双指针算法 四、数组操作&#xff1a;滑动窗口 视频讲解地址&#xff1a;动态-哔哩哔哩 一、存储方式 在python中的list本质是动态数组&#xff0c;支持自动扩容。还有一个numpy数组&#xff0c;…

京东Taro小程序原生端接入操作

首先对接之前先看文档&#xff0c;看是需要接入mPass平台&#xff0c;还是仅限在原生端接入Taro小程序&#xff1b; 本文章是仅限接入Taro小程序&#xff0c;接下来废话不多少&#xff0c;我们开始新的接入流程&#xff1a; 首先将这几个文件导入到当前项目中&#xff1a; 还…

iOS OC匹配多个文字修改颜色和字号

1、传入字符串数组&#xff0c;通过NSMutableAttributedString修改匹配文字 可以根据需要搞成匹配单个字符串 - (NSAttributedString *)applyFontSizeToText:(NSString *)text matchStrings:(NSArray<NSString *> *)matchStrings {NSMutableAttributedString *attribut…

【Qt】QWidget属性介绍

&#x1f3e0;个人主页&#xff1a;Yui_ &#x1f351;操作环境&#xff1a;Qt Creator &#x1f680;所属专栏&#xff1a;Qt 文章目录 前言1. enabled属性2.geometry属性2.1 改变控件位置2.2 女神表白程序2.3 知识补充——window frame 3. windowsTitle属性4. windowIcon属性…

基于机器学习的睡眠障碍预测模型对比分析

1、研究背景 2、数据概述 3. 数据可视化分析 (1) 各职业的平均睡眠时长 (2) BMI 分布 (3) 血压收缩压与舒张压的关系 (4) 每日步数的分布 (5) 睡眠质量的分布 4. 机器学习模型对比 (1) 决策树模型

Word 小黑第20套

对应大猫21 特定一页设为横向 上下用分页符