C++25设计模式之访问者模式

本文介绍了访问者模式,一种用于在不修改元素类的情况下定义作用于对象结构中各元素的新操作的设计模式。通过举例小米商店和电脑商店,展示了顾客访问行为,阐述了访问者模式的优点如符合单一职责原则,具有良好的扩展性和灵活性,以及缺点如可能违反迪米特原则并使元素变更困难。代码示例展示了如何实现抽象商店、具体商店、抽象访问者和具体访问者类,并在主函数中应用。访问者模式有效地解决了数据结构和操作之间的耦合问题。
摘要由CSDN通过智能技术生成

在这里插入图片描述
图片引用于百度

简介:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

优点:符合单一职责原则,很好的扩展性和灵活性

缺点:具体元素对访问者公布细节,违反了迪米特原则,具体元素变更比较困难

例子背景:现有小米商店和电脑商店,模拟顾客访问行为

访问者模式代码:

  • 抽象商店类:
#pragma once
#include <vector>
#include <string>
#include <iostream>
using namespace std;

class Visitor;

using StoreList = vector<string>;

class Store
{
protected:
        StoreList m_storeList;
public:
        Store() {}
        virtual ~Store() {}
public:
        virtual void AcceptAccess(Visitor* v) = 0;
        virtual StoreList GetCommodityList() { return m_storeList; }
};
  • 具体商店类:
#pragma once
#include "Store.h"

class ComputerStore : public Store
{
public:
        ComputerStore();
public:
        virtual void AcceptAccess(Visitor* v);
};

class XiaoMiStore : public Store
{
public:
        XiaoMiStore();
public:
        virtual void AcceptAccess(Visitor* v);
};
  • 具体商店cpp:
#include "Stores.h"
#include "Visitor.h"

ComputerStore::ComputerStore()
{
        m_storeList = { "i3电脑主机", "i5电脑主机", "i7电脑主机", "i9电脑主机" };
}

void ComputerStore::AcceptAccess(Visitor* v)
{
        v->AccessStore(this);
}

XiaoMiStore::XiaoMiStore()
{
        m_storeList = { "小米11", "小米12", "小米12 Pro", "小米12 法拉利联名款" };
}

void XiaoMiStore::AcceptAccess(Visitor* v)
{
        v->AccessStore(this);
}

  • 抽象访问者类:
#pragma once

class Store;

class Visitor
{
public:
        Visitor() {}
        virtual ~Visitor() {}
public:
        virtual void AccessStore(Store* s) = 0;
};
  • 具体访问者类:
#pragma once
#include "Visitor.h"

class Customer : public Visitor
{
public:
        Customer();
        virtual void AccessStore(Store* s);
};
  • 具体访问cpp:
#include "ConcreteVisitor.h"
#include "Store.h"

Customer::Customer()
{

}

void Customer::AccessStore(Store* s)
{
        cout << "店铺有:" << endl;
        for (auto iter : s->GetCommodityList())
        {
                cout << iter << "  ";
        }
        cout << endl << "顾客购买了" << s->GetCommodityList().at(0) << endl;
}

  • 引用:
#include "ConcreteVisitor.h"
#include "Stores.h"

int main()
{
        shared_ptr<Customer> customer(new Customer);
        shared_ptr<ComputerStore> computerStore(new ComputerStore);
        shared_ptr<XiaoMiStore> xiaomiStore(new XiaoMiStore);

        computerStore->AcceptAccess(customer.get());
        xiaomiStore->AcceptAccess(customer.get());

        getchar();
        return 0;
}

总结:
访问者模式(Visitor):访问者主要实现将数据结构与数据操作分离,稳定的数据结构和易变的操作耦合问题

作者:丶梦爱
博客:https://blog.csdn.net/u014732297(转载请说明出处)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值