设计模型之Visitor模式-图书馆管理系统应用C++实现
今天看到<<软件设计师>>面向对象第七章讲到几种设计模式,其中一种为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++实现相关推荐
- 华为战略规划落地的核心:VDBD(价值驱动业务设计模型) 盈利模式(利润模型)详细介绍
华为战略规划落地的核心:VDBD(价值驱动业务设计模型) & 盈利模式(利润模型)详细介绍 本文作者 | 谢宁,<华为战略管理法:DSTE实战体系>.<智慧研发管理>作 ...
- 【毕业设计_课程设计】基于SSM的图书馆管理系统
文章目录 0 项目说明 1 概述 2 环境配置 3 概念设计 4 逻辑设计 5 功能展示 6 项目源码 0 项目说明 基于SSM的图书馆管理系统 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 ...
- php图书馆管理系统的设计与实现毕业设计-附源码
摘 要 大数据时代下,数据呈爆炸式地增长.为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势.在图书馆的要求下,开发一款整体式结构的图书馆管理 ...
- ThinkPHP+基于ThinkPHP的图书馆管理系统 毕业设计-附源码311833
图书馆管理系统的设计与实现 摘 要 大数据时代下,数据呈爆炸式地增长.为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势.在图书馆的要求下,开 ...
- 高校图书馆管理系统的设计与实现
其他项目,点击作者主页 目录 1 系统简介 2 系统相关技术 2.1spring+springMVC+hibernate框架 2.2MySQL数据库 2.3bootstrap前端框架 3 需求分 ...
- Java web 课程设计——图书馆管理系统(SSM)
题目要求 本网上图书馆系统应实现图书网上检索.预约和续借功能: 系统管理:定义读者类别并设置参数,添加.修改和删除读者信息. 图书续借和预约:实现图书的续借.预约等功能. 图书检索:按书名或作者等信息 ...
- 车辆管理系统c语言课程设计报告,图书馆管理系统C语言课程设计报告
湖北科技大学程序设计课程设计报告项目名称: 图书馆管理系统学生名称: 朱捷学生编号: 2014117241班级: 软工作者1411指导老师: 龚雄星日期: 2016.2.251项目描述设计图书管理系统 ...
- 大一java图书馆管理系统课程设计
大一java图书馆管理系统课程设计 代码仅供参考!!!仅供参考!!! 效果图如下 管理员用户名:123 密码123 密码错误的话进入项目resources文件夹有个LMS数据库,使用数据库客户端打开 ...
- c语言课程设计(图书馆管理系统)
大一c语言课程设计:图书馆管理系统. 图书管理系统,功能齐全拿来就能用 1.主界面 代码段 void main() { int n;Sleep(300);loop1:tongji(); printf( ...
最新文章
- 2020-12-11 Python中的 if __name__ == “__main__“
- 从程序员到项目经理(十一):每个人都是管理者
- Object类有哪些公用方法?
- 利用Android Studio的 Monitor Memory 查找内存泄漏
- 批量调整word表格根据窗口调整内容
- 学习数字图像处理经验谈
- 【MySQL】rds 不支持镜像表/联合表,怎么办?
- 实验五 数独游戏界面设置
- linux lsnrctl命令不存在,linux – oracle lsnrctl TNS-12545:连接失败,因为目标主机或对象不存在...
- 用栈实现中缀表达式求值
- Cesium:加载OSGB倾斜摄影三维模型
- 【Java设计模式】——工厂模式
- imx8qm LVDS屏 DS90UB9478调试
- appium java模拟微信登录,使用Appium 测试微信小程序和微信公众号方法
- 微信机器人控制linux,关于微信公共平台聊天机器人控制开启和关闭的代码
- SocialBook帮你扫除网红营销乱象
- 洛谷 P3620 - P3621 数据备份、风铃、动物园(APIO 2007)
- 朝闻道(刘慈欣小说)
- Load balancer does not have available server for client问题
- 软嵌171 王学晨 作业二 时事评论