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

湖北省市政工程建设官方网站国际大新闻最新消息

湖北省市政工程建设官方网站,国际大新闻最新消息,国家建设工程网查询,淘宝客网站 备案图片转载自 #include<iostream> using namespace std; #include<list> /*模板工厂单例化&#xff0c;所有的商品被注册进工厂中*/ /*访问者模式&#xff08;行为型模式&#xff09; 访问者&#xff0c;被访问者 visit accept 让访问变成一种操作&#xff0c;不同…

在这里插入图片描述
图片转载自

#include<iostream>
using namespace std;
#include<list>
/*模板工厂单例化,所有的商品被注册进工厂中*/
/*访问者模式(行为型模式)
访问者,被访问者
visit   accept
让访问变成一种操作,不同的访问操作有具体的实现,但是无需修改源代码(准确点说,是无需修改被访问者的源代码)
只需要增加新的具体访问类即可。局部的符合开闭原则,只是访问者类需要进行扩展和少量修改
在vitst方法中以被访问者作为参数,方法体是被访问者调用accept方法
*/
class Apple;
class Book;class Vistor
{
public:void set_name(std::string name){_name = name;}virtual void visit(Apple* apple) = 0;virtual void visit(Book* book) = 0;
protected:std::string _name;//观察者的名字
};class Customer :public Vistor
{void visit(Apple* apple){cout << "顾客" << _name << "挑选苹果" << endl;}void visit(Book* book){cout << "顾客" << _name << "买书"<<endl;}
};class Saler :public Vistor
{void visit(Apple* apple){cout << "收银员" << _name << "称苹果" << endl;}void visit(Book* book){cout << "收银员" << _name << "计算书价" << endl;}
};class Product
{
public:virtual void accept(Vistor* vistor) = 0;
};class Apple :public Product
{
public:void accept(Vistor* vistor)override{vistor->visit(this);}
};class Book :public Product
{
public:void accept(Vistor* vistor)override//在具体的被访问者类中的accept方法,参数都是访问者的父类{vistor->visit(this);}
};class ShoppingCart//管理者,可以增加或删除商品
{
public:void accept(Vistor* vistor){for (auto prd : _prd_list)prd->accept(vistor);}void addProduct(Product* product){_prd_list.push_back(product);}void removeProduct(Product* product){_prd_list.remove(product);}
private:std::list<Product*> _prd_list;
};int main()
{Book book;Apple apple;ShoppingCart basket;basket.addProduct(&book);basket.addProduct(&apple);Customer customer1;customer1.set_name("小明");basket.accept(&customer1);Saler saler;saler.set_name("小米");basket.accept(&saler);return 0;
}

这个示例代码写得一般,重点理解上面那张图:访问者模式就是在新增一个visitor类,visitor的visit方法定义参数为物品的抽象父类,同时在accepter中增加accept方法,accept方法参数为visitor,这样当具体访问者,调用其visit方法,方法体为accepter.accept()。

可以看到在保证accepter的数据结构不发生变化的情况下(没有新增或者删除),可以非常方便增加新的一种访问方法,只需要新增加一个访问类即可,但是如果我们数据结构发生变化之后,就需要修改继承自Visitor类的所有类了,这也违背了开闭原则,因此我们应该认真考虑,到底我们的数据结构是定死的还是经常变化的。没有任何一种设计模式是十全十美的,总是有所取舍,有所利弊,根据实际情况来选择才是最好的设计方法。

http://www.khdw.cn/news/56654.html

相关文章:

  • 学校网站怎样建设抖音seo优化排名
  • 想做网站怎么跟做网站的公司谈判电商网站建设方案
  • 秦皇岛手机网站制作多少钱网站入口
  • 网站建设与管理基础渠道销售怎么找客户
  • 柳州做网站价格重庆seo整站优化效果
  • 商赢网站建设谷歌搜索引擎363入口
  • 魔改wordpress主题杭州seo排名优化外包
  • wrix 网站开发搜索引擎大全排名
  • 怎么美化网站发布软文
  • 网站logo大全色盲测试图免费测试
  • 印度做网站快速排名程序
  • 一个做外汇的网站叫熊猫什么的看网站时的关键词
  • 怎样在手机做自己的网站6站内优化包括哪些
  • 山西两学一做网站百度经验官网
  • 网站制作报价表2345网址导航应用
  • 怎么自己做网站游戏网络营销现状分析
  • 企业邮箱登录入口126seo推广论坛
  • 京东seo是什么意思优化关键词步骤
  • 网页设计模板html代码素材优化外包服务公司
  • 中山网站建设文化如何杭州云优化信息技术有限公司
  • 怎么做不占CPU的网站电脑培训班速成班
  • 如何建立公司网站账号百度爱采购竞价推广
  • 网络宣传网站建设定制日本和韩国是亚洲的国家
  • 视频分享网站模板关键词查询工具免费
  • wordpress 404 nginx西安网站排名优化培训
  • 佛山网站建设联系电话百度推广营销方案
  • 大连网站推广怎么收费重庆seo推广运营
  • 焦作市住房和城乡建设局网站百度移动端排名软件
  • 制作网站怎么做的网页设计教程
  • wordpress源代码很乱seo推广网址