• C++设计模式 - 访问器模式(Visitor)


    行为变化模式

    • 在组件的构建过程中,组件行为的变化经常导致组件本身剧烈的变化。“行为变化” 模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合。

    典型模式

    Visitor

    动机( Motivation )

    • 在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法) , 如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。
    • 如何在不更改类层次结构的前提下,在运行时根据需要 透明地为类层次结构.上的各个类动态添加新的操作,从而避免,上述问题?

    模式定义

    表示一个作用于某对象结构中的各元素的操作。使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作(变化)。

    结构

    在这里插入图片描述

    要点总结

    • Visito:模式通过所谓双重分发(double dispath )来实现在不更改,(不添加新的操作-编译时)Elemen类层次结构的前提下在运行时透明地为类层次结构上的各个类动态添和新的操作(支持变化)。
    • 所谓双重分发即Visitor模式中间包括了两个多态分发(注意其中的多态机制):第一个为accept方法的多态 辨析;第二个为visitElementX方法的多态辨析
    • Visito模式最大缺点在于扩展类层次结构(增添新的Element子类)会导致Visito类的改变。因此Visito模式适用于Element类层次结构稳定,而其中的操作却经常面临频繁改动。

    cpp

    #include<iostream>
    using namespace std;
    
    class Visitor;
    class Element {
    public:
    	virtual void accept(Visitor& visitor) = 0;//第一次多态辨析(找accept)
    	virtual ~Element() {}
    };
    class ElementA :public Element {
    public:
    	virtual void accept(Visitor& visitor) override; //第二次多态辨析(找visitElementA)
    };
    class ElementB :public Element {
    public:
    	void accept(Visitor& visitor) override;
    };
    
    class Visitor {
    public:
    	virtual void visitElementA(ElementA& element) = 0;
    	virtual void visitElementB(ElementB& element) = 0;
    	virtual ~Visitor() {}
    };
    
    void ElementA::accept(Visitor& visitor) {
    	visitor.visitElementA(*this);//第二次多态辨析(找visitElementA)
    }
    void ElementB::accept(Visitor& visitor) {
    	visitor.visitElementB(*this);
    }
    //=================
    //对行为进行更改
    class Visiter1 :public Visitor {
    public:
    	void visitElementA(ElementA& element) override {
    		cout << "Visitor1 process ElementA" << endl;
    	}
    	void visitElementB(ElementB& element) override {
    		cout << "Visitor1 process ElementB" << endl;
    	}
    };
    
    class Visiter2 :public Visitor {
    public:
    	void visitElementA(ElementA& element) override {
    		cout << "Visitor2 process ElementA" << endl;
    	}
    	void visitElementB(ElementB& element) override {
    		cout << "Visitor2 process ElementB" << endl;
    	}
    };
    
    int main()
    {
    	Visiter1 visitor;
    	ElementA elementA;
    	elementA.accept(visitor);//二次多态辨析
    
    	ElementB elementB;
    	elementB.accept(visitor);
    	return 0;
    }
    
    

    __EOF__

  • 本文作者: 放飞梦想
  • 本文链接: https://www.cnblogs.com/chengmf/p/16056190.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    rh358 005 dhcp dhcp6 打印机 ansible配置dhcp和打印机
    【LeetCode每日一题】【递归/位运算】2022-10-20 779. 第K个语法符号 Java实现
    【Android进阶】2、Android 的 MVC 设计模式
    Vim 常用指令
    winget包管理器
    【论文 01】《Attention is all you need》
    JAVA练习题36:打乱一维数组中的数据,并按照4个一组的方式添加到二维数组中
    Opengl ES之YUV数据渲染
    力扣(LeetCode)128. 最长连续序列(C++)
    时间轴、流程类时间轴绘制
  • 原文地址:https://www.cnblogs.com/chengmf/p/16056190.html