11.11总结
include
include
include
using namespace std;
class AbstractFile {
public:
virtual void add(AbstractFile* element) = 0;
virtual void remove(AbstractFile* element) = 0;
virtual void display() = 0;
};
class VideoFile : public AbstractFile {
private:
string fileName;
public:
VideoFile(string fileName) {
this->fileName = fileName;
}
void add(AbstractFile* element) {
cout << "VideoFile:add -> " << this->fileName << endl;
}
void remove(AbstractFile* element) {
cout << "VideoFile:remove -> " << this->fileName << endl;
}
void display() {
cout << "VideoFile:display -> " << this->fileName << endl;
}
};
class TextFile :public AbstractFile {
private:
string fileName;
public:
TextFile(string fileName) {
this->fileName = fileName;
}
void add(AbstractFile* element) {
cout << "TextFile:add -> " << this->fileName << endl;
}
void remove(AbstractFile* element) {
cout << "TextFile:remove -> " << this->fileName << endl;
}
void display() {
cout << "TextFile:display -> " << this->fileName << endl;
}
};
class ImageFile :public AbstractFile {
private:
string fileName;
public:
ImageFile(string fileName) {
this->fileName = fileName;
}
void add(AbstractFile* element) {
cout << "ImageFile:add -> " << this->fileName << endl;
}
void remove(AbstractFile* element) {
cout << "ImageFile:remove -> " << this->fileName << endl;
}
void display() {
cout << "ImageFile:display -> " << this->fileName << endl;
}
};
class Folder :public AbstractFile {
private:
list<AbstractFile> _list;
string fileName;
public:
Folder(string fileName) {
this->fileName = fileName;
_list = new list<AbstractFile>;
}
~Folder() {
if (_list != NULL)
{
while (_list->empty()) {
delete (_list->begin());
_list->erase(_list->begin());
}
delete _list;
}
}
string getFileName() const {
return fileName;
}
void add(AbstractFile element) {
cout << "Folder:add";
element->display();
_list->push_back(element);
}
void remove(AbstractFile element) {
cout << "Folder:remove";
element->display();
_list->remove(element);
}
void display() {
if (_list != NULL) {
list<AbstractFile>::iterator it = _list->begin();
while (it != _list->end()) {
(it++)->display();
}
}
}
};
int main() {
AbstractFile *obj1, *obj2, *obj3, *obj4;
Folder *plate1, *plate2;
obj1 = new ImageFile("ImageFile");
obj2 = new TextFile("TextFile");
plate1 = new Folder("folder1");
plate1->add(obj1);
plate1->add(obj2);
cout << "-------------plate1中文件内容-----------------" << endl;
plate1->display();
cout << "------------------------------" << endl;
obj3 = new VideoFile("VideoFile");
plate2 = new Folder("folder2");
plate2->add(obj3);
cout << "-------------plate2中文件内容-----------------" << endl;
plate2->display();
cout << "------------------------------" << endl;
plate1->remove(obj1);
cout << "-------------plate1中文件内容-----------------" << endl;
plate1->display();
}
访问者模式(Visitor Pattern)是一种强大的行为型设计模式,它允许你在不改变被访问对象的类的前提下,定义新的操作和行为。本文将详细介绍访问者模式,包括其定义、举例说明、结构、实现步骤、Java代码实现、典型应用场景、优缺点、类似模式以及最后的小结。
1 模式的定义
访问者模式允许你在不修改被访问对象的类的情况下,定义并封装一组新的操作。它通常用于处理对象结构中的元素,并能够在不改变这些元素的类的情况下,为这些元素添加新的操作。这种模式的关键思想是将操作与元素分离,使得增加新操作变得相对容易。
2 举例说明
访问者模式的思想在日常生活中有许多应用,以下是几个比较符合访问者模式且为大家所熟知的例子:
博物馆导览员:在博物馆中,导览员扮演着访问者的角色。博物馆中的艺术品、展品等可以被看作是元素,而导览员则是具体访问者。导览员可以根据参观者的需求,为他们提供不同的讲解、信息或故事,而不需要改变艺术品本身。
旅游团队:旅游团队的导游可以被看作是访问者,而游客可以被视为元素。导游可以根据游客的兴趣和需求,提供不同的旅游信息和体验,而不需要修改景点本身。
电子商务网站的购物车:在电子商务网站中,购物车可以被看作是对象结构,而购买的商品可以被视为元素。不同的访问者可以执行不同的操作,例如计算总价、生成订单等,而不需要修改商品类的代码。
这些例子都展示了访问者模式的核心思想:允许在不改变元素本身的情况下,为元素执行不同的操作。这种分离关注点的设计模式在实际生活中具有广泛的应用。
3 结构
访问者模式由以下主要组件组成:
访问者(Visitor):定义了要访问的对象的接口,包括访问不同类型对象的方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏