当前位置: 首页 > news >正文

设计模式之访问器模式(Visitor)的C++实现

1、访问器模式的提出

在软件开发过程中,早已发布的软件版本,由于需求的变化,需要给某个类层次结构增加新的方法。如果在该基类和子类中都添加新的行为方法,将给代码原有的结构带来破坏,同时,也违反了修改封闭,扩展开放的原则。访问器模式可以实现不改变原有代码结构的前提下,基于双向分发机制(2次虚函数绑定实例对象),通过扩展的方法实现新的接口。

2、需求描述

有2个固定数量的元素AB,每个元素有不同方法。A、B元素的方法有可能还会更新。请设计一个功能代码,可以应对方法更新的代码。

3、功能实现

(1)UML图如下:

 (2)代码实现如下:

#include <iostream>class ConcreteElementA;
class ConcreteElementB;
class Visitor
{
public:virtual void visitorElementA(ConcreteElementA& element)=0; //第二次虚函数virtual void visitorElementB(ConcreteElementB& element)=0;
};class Element
{
public:virtual void accept(Visitor& visitor)=0;    //第一次虚函数virtual ~Element(){};
};class ConcreteElementA:public Element
{
public:void accept(Visitor &visitor) override{visitor.visitorElementA(*this);}
};class ConcreteElementB:public Element
{
public:void accept(Visitor &visitor) override{visitor.visitorElementB(*this);}
};// 上面是稳定的代码结构 // 下面是扩展应对方法改变的功能类 
class ConcreteVisitor1:public Visitor
{
public:void visitorElementA(ConcreteElementA &element) override{std::cout << "Visitor1 process visitorElementA "<< &element << std::endl;}void visitorElementB(ConcreteElementB &element) override{std::cout << "Visitor1 process visitorElementB " << &element << std::endl;}
};class ConcreteVisitor2:public Visitor
{
public:void visitorElementA(ConcreteElementA &element) override{std::cout << "Visitor2 process visitorElementA " << &element<< std::endl;}void visitorElementB(ConcreteElementB &element) override{std::cout << "Visitor2 process visitorElementB " << &element << std::endl;}
};class Client{
public:void doWork(){ConcreteVisitor1 visitor1;ConcreteElementA element1A;element1A.accept(visitor1);ConcreteElementB element1B;element1B.accept(visitor1);ConcreteVisitor2 visitor2;ConcreteElementA element2A;element2A.accept(visitor2);ConcreteElementB element2B;element2B.accept(visitor2);}
};int main()
{Client obj;obj.doWork();return 0;
}

程序运行的结果如下:

 上面的代码,ConcreteElementA和ConcreteElementB的方法更新,通过Visitor基类的扩展子类来实现。

通过上面的代码可以看出,使用访问器模式的应用场景必须满足下面的条件:
(1)Element的子类个数必须确定。
(2)Visitor的子类必须实现Element的所有子类方法。

http://www.lryc.cn/news/165167.html

相关文章:

  • Python之OS模块
  • vue 使用canvas 详细教程
  • Git 基本操作【本地仓库与远程仓库的推送、克隆和拉取】
  • FPGA开发
  • js手撕代码
  • typecho反序列化
  • php程序设计的基本原则
  • python execute() 使用%s 拼接sql 避免sql注入攻击 好于.format
  • RPC项目解析(1)
  • 点云从入门到精通技术详解100篇-基于 RGB 图像与点云融合的三维点云分割算法及成像系统
  • JDK8新特性
  • X86_64函数调用汇编程序分(2)
  • 组件传值之ref(解决父传子动态绑定问题)
  • vscode-server
  • ubuntu 20.04安装开发环境总结_安装python
  • 尚硅谷_宋红康_IntelliJ IDEA 常用快捷键一览表
  • Java设计模式之建造者模式详解(Builder Pattern)
  • TCP的滑动窗口与拥塞控制
  • MySQL更新语句执行过程
  • Matlab图像处理-彩色图像基础
  • MATLAB算法实战应用案例精讲-【数模应用】数据中台
  • el-form动态检验无法生效问题(已解决)
  • 【python】代码学习过程问题总结
  • Qt应用开发(基础篇)——菜单 QMenu
  • MySQL-DDL语句
  • 总结987
  • 【服务器 | 测试】如何在centos 7上面安装jmeter
  • 20.04部署cartographer
  • djangoMTV初探
  • Minecraft--基于云服务器搭建自己的服务器--简易搭建