今天看到<<软件设计师>>面向对象第七章讲到几种设计模式,其中一种为Visitor模式。这种设计模式通过访问者对象的建立,在访问过程中将访问者作为参数传到被访问对象的函数中,实现了有选择性的访问不同类的资源。

其中有一个Visitor模式设计的应用,参考书中的代码,在本地测试跑了一下。

//
//  library_visitor.cpp
//  data_structure
/*某图书管理系统中管理者两种类型的文献:图书和论文。现在要求统计所有馆藏文献的总页码(假设图书馆中有一本540页的图书和两篇各25页的论文,那么馆藏文献的总页码就是590页)。适合采用Visitor模式实现该要求。*/
//  Created by simon zhao on 2021/4/4.
//  Copyright © 2021 simon zhao. All rights reserved.
//#include "library_visitor.hpp"
#include <string>
#include <iostream>using namespace std;//声明访问者类
class LibraryVisitor;//定义被访问者基类
class LibraryItemInterface{
public:virtual void accept(LibraryVisitor * visitor){};};//定义被访问-文章类
class Article:LibraryItemInterface{private:string m_title;//论文名string m_author;//论文作者int m_start_page;int m_end_page;public:Article(string p_title,string p_author,int p_start_page,int p_end_page);int getNumberOfPages();//获取论文的页数void accept(LibraryVisitor* visitor);//vistor模式下将visitor作为参数传递通过accept函数访问};//定义被访问-图书类
class Book:LibraryItemInterface{private:string m_title;string m_author;int m_pages;
public:Book(string p_title,string p_author,int p_page);int getNumberOfPages();void accept(LibraryVisitor* visitor);
};//方法实现 BOOK
Book::Book(string p_title,string p_author,int p_page){m_title=p_title;m_author=p_author;m_pages=p_page;
};int Book::getNumberOfPages(){cout<<m_title<<"加入统计:"<<m_pages<<"页"<<endl;return m_pages;
}//方法实现 Article
Article::Article(string p_title,string p_author,int p_start_page,int p_end_page){m_title=p_title;m_author=p_author;m_start_page=p_start_page;m_end_page=p_end_page;
}
int Article::getNumberOfPages(){cout<<m_title<<"加入统计:"<<m_end_page-m_start_page<<"页"<<endl;return m_end_page-m_start_page;
}//定义访问者基类
class LibraryVisitor{
public:virtual void visit(Article* article){};virtual void visit(Book* book){};virtual void printSum(){};
};//被访问者的accpet方法实现
void Book::accept(LibraryVisitor* visitor){visitor->visit(this);
};
void Article::accept(LibraryVisitor* visitor){visitor->visit(this);
}//访问者执行的子类
class LibrarySumPrintVisitor:public LibraryVisitor{
private:int total_sum;
public:LibrarySumPrintVisitor(){cout<<"初始化对象"<<endl;}//构造方法void visit(Article* article){total_sum += article->getNumberOfPages();}void visit(Book* book){total_sum += book->getNumberOfPages();}void printSum(){cout<<"一共的页数"<<total_sum<<endl;};};int main(){//初始化被访问者Book b1 = Book("狂人日记", "鲁迅", 540);Article a1 = Article("神经网络", "bengio", 12, 37);Article a2 = Article("NLP","bengio",8,33);//初始化访问者LibrarySumPrintVisitor vistor =LibrarySumPrintVisitor();//第一次错误理解访问者模式代码
//    vistor.visit(&b1);
//    vistor.visit(&a1);
//    vistor.visit(&a2);//评论区@将手伸向星空指正后修改b1.accept(&visitor);a1.accept(&visitor);a2.accept(&visitor);vistor.printSum();};

在本地编译运行了一下结果:

XX_USER:$ gcc -lstdc++ library_visitor.cpp -o test
XX_USER:$ ./test
初始化对象
狂人日记加入统计:540页
神经网络加入统计:25页
NLP加入统计:25页
一共的页数590

由于C++才刚开始学习,本文主要目的是为了做记录,如有代码不规范的地方请大家批评指正。

设计模型之Visitor模式-图书馆管理系统应用C++实现相关推荐

  1. 华为战略规划落地的核心:VDBD(价值驱动业务设计模型) 盈利模式(利润模型)详细介绍

    华为战略规划落地的核心:VDBD(价值驱动业务设计模型) & 盈利模式(利润模型)详细介绍 本文作者 | 谢宁,<华为战略管理法:DSTE实战体系>.<智慧研发管理>作 ...

  2. 【毕业设计_课程设计】基于SSM的图书馆管理系统

    文章目录 0 项目说明 1 概述 2 环境配置 3 概念设计 4 逻辑设计 5 功能展示 6 项目源码 0 项目说明 基于SSM的图书馆管理系统 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 ...

  3. php图书馆管理系统的设计与实现毕业设计-附源码

    摘 要 大数据时代下,数据呈爆炸式地增长.为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势.在图书馆的要求下,开发一款整体式结构的图书馆管理 ...

  4. ThinkPHP+基于ThinkPHP的图书馆管理系统 毕业设计-附源码311833

    图书馆管理系统的设计与实现 摘 要 大数据时代下,数据呈爆炸式地增长.为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势.在图书馆的要求下,开 ...

  5. 高校图书馆管理系统的设计与实现

     其他项目,点击作者主页   目录 1 系统简介 2 系统相关技术 2.1spring+springMVC+hibernate框架 2.2MySQL数据库 2.3bootstrap前端框架 3 需求分 ...

  6. Java web 课程设计——图书馆管理系统(SSM)

    题目要求 本网上图书馆系统应实现图书网上检索.预约和续借功能: 系统管理:定义读者类别并设置参数,添加.修改和删除读者信息. 图书续借和预约:实现图书的续借.预约等功能. 图书检索:按书名或作者等信息 ...

  7. 车辆管理系统c语言课程设计报告,图书馆管理系统C语言课程设计报告

    湖北科技大学程序设计课程设计报告项目名称: 图书馆管理系统学生名称: 朱捷学生编号: 2014117241班级: 软工作者1411指导老师: 龚雄星日期: 2016.2.251项目描述设计图书管理系统 ...

  8. 大一java图书馆管理系统课程设计

    大一java图书馆管理系统课程设计 代码仅供参考!!!仅供参考!!! 效果图如下 管理员用户名:123  密码123 密码错误的话进入项目resources文件夹有个LMS数据库,使用数据库客户端打开 ...

  9. c语言课程设计(图书馆管理系统)

    大一c语言课程设计:图书馆管理系统. 图书管理系统,功能齐全拿来就能用 1.主界面 代码段 void main() { int n;Sleep(300);loop1:tongji(); printf( ...

最新文章

  1. 2020-12-11 Python中的 if __name__ == “__main__“
  2. 从程序员到项目经理(十一):每个人都是管理者
  3. Object类有哪些公用方法?
  4. 利用Android Studio的 Monitor Memory 查找内存泄漏
  5. 批量调整word表格根据窗口调整内容
  6. 学习数字图像处理经验谈
  7. 【MySQL】rds 不支持镜像表/联合表,怎么办?
  8. 实验五 数独游戏界面设置
  9. linux lsnrctl命令不存在,linux – oracle lsnrctl TNS-12545:连接失败,因为目标主机或对象不存在...
  10. 用栈实现中缀表达式求值
  11. Cesium:加载OSGB倾斜摄影三维模型
  12. 【Java设计模式】——工厂模式
  13. imx8qm LVDS屏 DS90UB9478调试
  14. appium java模拟微信登录,使用Appium 测试微信小程序和微信公众号方法
  15. 微信机器人控制linux,关于微信公共平台聊天机器人控制开启和关闭的代码
  16. SocialBook帮你扫除网红营销乱象
  17. 洛谷 P3620 - P3621 数据备份、风铃、动物园(APIO 2007)
  18. 朝闻道(刘慈欣小说)
  19. Load balancer does not have available server for client问题
  20. 软嵌171 王学晨 作业二 时事评论

热门文章

  1. 深圳监控安装上门服务简介
  2. 深圳python培训学习班
  3. 最新短网址链接生成系统源码+短链防红功能
  4. 研究人员开发实时歌词生成技术以激发歌曲创作灵感
  5. 数据结构--基本概念
  6. Android Studio运行app启动模拟器一直卡在“Wating for target device to come online”的解决办法
  7. HDU6438 Buy and Resell
  8. 电脑常用技巧:常用DOS命令大全
  9. 新一配:金融学的历史起源和主要分类【转载】
  10. Go语言编程设计学习Day1:helloworld 变量 常量