《访问者模式(极简c++)》

本文介绍了C++中的访问者模式,它将数据结构与操作分离,便于扩展新操作。虽然不常用,但在处理需要根据不同数据类型执行不同操作的场景时,如打印Sparrow和Pigeon的数据,访问者模式提供了一种清晰的解决方案。
摘要由CSDN通过智能技术生成
        本文章属于专栏- 概述 - 《设计模式(极简c++版)》-CSDN博客

模式说明
  • 方案:将数据结构与数据操作分离,使得数据结构可以在不改变的情况下,添加新的操作。
  • 优点:增加新的操作易于扩展,符合开闭原则;将相关行为封装在一起,使得代码易于维护。
  • 缺点:增加新的数据结构需要修改所有的访问者类,可能引入依赖倒置问题。
本质思想数据类型A基本不变。但是对应的具体操作O会变化,把这些操作O抽象成一个类B。在类A要操作O的时候,传入类B,以触发动作
实践建议:并不常用。对大部分情况下,直接修改类中的操作接口就行,如果有类似操作,一般直接抽象一个操作类,和现有类组合就行。这样代码逻辑也会更易读
#include <iostream>

// Forward declaration of concrete bird classes
class Sparrow;
class Pigeon;

// Abstract base class for visitor
class BirdVisitor {
public:
    virtual void visit(Sparrow& sparrow) = 0;
    virtual void visit(Pigeon& pigeon) = 0;
};

// Concrete bird class: Sparrow
class Sparrow {
public:
    void accept(BirdVisitor& visitor) {
        visitor.visit(*this);
    }
};

// Concrete bird class: Pigeon
class Pigeon {
public:
    void accept(BirdVisitor& visitor) {
        visitor.visit(*this);
    }
};

// Concrete visitor class: PrintVisitor
class PrintVisitor : public BirdVisitor {
public:
    void visit(Sparrow& sparrow) override {
        std::cout << "Printing data for Sparrow" << std::endl;
    }

    void visit(Pigeon& pigeon) override {
        std::cout << "Printing data for Pigeon" << std::endl;
    }
};

int main() {
    Sparrow sparrow;
    Pigeon pigeon;
    PrintVisitor printVisitor;

    sparrow.accept(printVisitor); // Output: Printing data for Sparrow
    pigeon.accept(printVisitor); // Output: Printing data for Pigeon

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值