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

番禺高端网站建设公司市场营销策略包括哪些策略

番禺高端网站建设公司,市场营销策略包括哪些策略,科技侠智能锁,污染网站代码文章目录 一.什么是访问者模式?二.访问者模式的结构三.访问者模式的应用场景四.访问者模式的优缺点五.访问者模式的C实现六.访问者模式的JAVA实现七.代码解释八.总结 类图: 访问者设计模式类图 一.什么是访问者模式? 访问者模式(…

文章目录

  • 一.什么是访问者模式?
  • 二.访问者模式的结构
  • 三.访问者模式的应用场景
  • 四.访问者模式的优缺点
  • 五.访问者模式的C++实现
  • 六.访问者模式的JAVA实现
  • 七.代码解释
  • 八.总结

类图: 访问者设计模式类图

一.什么是访问者模式?

访问者模式(Visitor Pattern)是一种行为型设计模式,允许在不更改元素类的情况下,为对象结构中的元素增加新的操作。访问者模式通过将操作从元素类中抽离出来,实现操作的扩展。
 在访问者模式中,核心思想是将数据结构和操作分开,数据结构负责提供必要的接口,而具体的操作逻辑由访问者实现。

二.访问者模式的结构

  • Visitor(访问者接口):声明一组访问方法,每个方法对应一种具体的元素类型。
  • ConcreteVisitor(具体访问者):实现访问者接口中声明的操作,对不同的元素提供不同的处理。
  • Element(元素接口):定义一个Accept方法,用于接收访问者对象。
  • ConcreteElement(具体元素):实现元素接口,并在Accept方法中调用访问者的相应方法。
  • ObjectStructure(对象结构):提供元素的容器,负责存储和遍历元素。
    在这里插入图片描述

三.访问者模式的应用场景

  1. 数据结构稳定,操作逻辑需要频繁变化:例如编译器中的语法树遍历。
  2. 需要对一组不相关的类执行操作:如不同形状的图形对象(圆形、矩形等)。
  3. 需要集中管理行为,而不想污染元素类

四.访问者模式的优缺点

  • 优点
    • 增加新的操作很方便,只需新增一个具体访问者类。
    • 遵循单一职责原则,将操作与元素本身解耦。
  • 缺点
    • 增加新的元素类型需要修改所有访问者,违背了开闭原则。
    • 对象结构不容易扩展。

五.访问者模式的C++实现

#include <iostream>
#include <vector>
#include <memory>// 前置声明,避免循环引用
class ConcreteElementA;
class ConcreteElementB;
class Visitor;// 访问者接口(Visitor)
class Visitor {
public:virtual void visitConcreteElementA(ConcreteElementA& element) = 0;virtual void visitConcreteElementB(ConcreteElementB& element) = 0;virtual ~Visitor() = default;
};// 元素接口(Element)
class Element {
public:virtual void accept(std::shared_ptr<Visitor> visitor) = 0;virtual ~Element() = default;
};// 具体元素 A(ConcreteElementA)
class ConcreteElementA : public Element {
public:void accept(std::shared_ptr<Visitor> visitor) override {visitor->visitConcreteElementA(*this);}void operationA() {std::cout << "ConcreteElementA specific operation.\n";}
};// 具体元素 B(ConcreteElementB)
class ConcreteElementB : public Element {
public:void accept(std::shared_ptr<Visitor> visitor) override {visitor->visitConcreteElementB(*this);}void operationB() {std::cout << "ConcreteElementB specific operation.\n";}
};// 具体访问者 1(ConcreteVisitor1)
class ConcreteVisitor1 : public Visitor {
public:void visitConcreteElementA(ConcreteElementA& element) override {std::cout << "ConcreteVisitor1 visiting ConcreteElementA.\n";element.operationA();}void visitConcreteElementB(ConcreteElementB& element) override {std::cout << "ConcreteVisitor1 visiting ConcreteElementB.\n";element.operationB();}
};// 具体访问者 2(ConcreteVisitor2)
class ConcreteVisitor2 : public Visitor {
public:void visitConcreteElementA(ConcreteElementA& element) override {std::cout << "ConcreteVisitor2 visiting ConcreteElementA.\n";element.operationA();}void visitConcreteElementB(ConcreteElementB& element) override {std::cout << "ConcreteVisitor2 visiting ConcreteElementB.\n";element.operationB();}
};// 对象结构(ObjectStructure)
class ObjectStructure {
private:std::vector<std::shared_ptr<Element>> elements;public:void addElement(std::shared_ptr<Element> element) {elements.push_back(element);}void accept(std::shared_ptr<Visitor> visitor) {for (auto& element : elements) {element->accept(visitor);}}
};// 测试代码
int main() {// 创建对象结构ObjectStructure objectStructure;// 添加元素objectStructure.addElement(std::make_shared<ConcreteElementA>());objectStructure.addElement(std::make_shared<ConcreteElementB>());// 创建访问者 1 并访问std::shared_ptr<Visitor> visitor1 = std::make_shared<ConcreteVisitor1>();std::cout << "Using ConcreteVisitor1:\n";objectStructure.accept(visitor1);// 创建访问者 2 并访问std::shared_ptr<Visitor> visitor2 = std::make_shared<ConcreteVisitor2>();std::cout << "\nUsing ConcreteVisitor2:\n";objectStructure.accept(visitor2);return 0;
}

六.访问者模式的JAVA实现

// 抽象访问者
interface Visitor {void VisitConcreteElementA(ConcreteElementA elementA);void VisitConcreteElementB(ConcreteElementB elementB);
}// 具体访问者1
class ConcreteVisitor1 implements Visitor {@Overridepublic void VisitConcreteElementA(ConcreteElementA elementA) {System.out.println("ConcreteVisitor1 visiting ConcreteElementA");}@Overridepublic void VisitConcreteElementB(ConcreteElementB elementB) {System.out.println("ConcreteVisitor1 visiting ConcreteElementB");}
}// 具体访问者2
class ConcreteVisitor2 implements Visitor {@Overridepublic void VisitConcreteElementA(ConcreteElementA elementA) {System.out.println("ConcreteVisitor2 visiting ConcreteElementA");}@Overridepublic void VisitConcreteElementB(ConcreteElementB elementB) {System.out.println("ConcreteVisitor2 visiting ConcreteElementB");}
}// 抽象元素
abstract class Element {public abstract void Accept(Visitor visitor);
}// 具体元素A
class ConcreteElementA extends Element {@Overridepublic void Accept(Visitor visitor) {visitor.VisitConcreteElementA(this);}public void OperationA() {System.out.println("ConcreteElementA specific operation.");}
}// 具体元素B
class ConcreteElementB extends Element {@Overridepublic void Accept(Visitor visitor) {visitor.VisitConcreteElementB(this);}public void OperationB() {System.out.println("ConcreteElementB specific operation.");}
}// 对象结构
class ObjectStructure {private final List<Element> elements = new ArrayList<>();public void Add(Element element) {elements.add(element);}public void Accept(Visitor visitor) {for (Element element : elements) {element.Accept(visitor);}}
}// 客户端代码
public class VisitorPatternDemo {public static void main(String[] args) {// 创建对象结构ObjectStructure structure = new ObjectStructure();// 添加具体元素structure.Add(new ConcreteElementA());structure.Add(new ConcreteElementB());// 创建并使用访问者1ConcreteVisitor1 visitor1 = new ConcreteVisitor1();structure.Accept(visitor1);// 创建并使用访问者2ConcreteVisitor2 visitor2 = new ConcreteVisitor2();structure.Accept(visitor2);}
}

七.代码解释

  1. Element 接口和 ConcreteElement
    • Element接口定义了一个accept方法,具体元素类需要实现该方法,并在其中调用访问者的相应方法。
  2. Visitor 接口和 ConcreteVisitor
    • Visitor接口声明了针对每种具体元素的访问方法。
    • ConcreteVisitor1和ConcreteVisitor2实现了Visitor接口,并定义了对ConcreteElementA和ConcreteElementB的具体操作。
  3. ObjectStructure 类
    • ObjectStructure维护了一个元素集合,并提供accept方法,用于将访问者传递给集合中的每个元素。
  4. 测试代码
    • 创建了一个对象结构,并添加了两种具体元素。
    • 使用两个不同的访问者访问元素集合,展示了访问者模式的扩展性。

八.总结

访问者模式是一种将操作和数据结构分离的强大工具。当需要频繁添加新的操作或行为时,它提供了扩展性良好的解决方案。通过访问者模式,可以大幅简化复杂操作的管理,提升代码的可读性和维护性


文章转载自:
http://planer.Lbqt.cn
http://coequality.Lbqt.cn
http://dislocation.Lbqt.cn
http://abwatt.Lbqt.cn
http://metaphysics.Lbqt.cn
http://cause.Lbqt.cn
http://iodometry.Lbqt.cn
http://microinjection.Lbqt.cn
http://toxophilitic.Lbqt.cn
http://swob.Lbqt.cn
http://underskirt.Lbqt.cn
http://thermionics.Lbqt.cn
http://regularise.Lbqt.cn
http://endoplasm.Lbqt.cn
http://overfraught.Lbqt.cn
http://syndactyl.Lbqt.cn
http://drupelet.Lbqt.cn
http://chelyabinsk.Lbqt.cn
http://theatregoing.Lbqt.cn
http://contrafactum.Lbqt.cn
http://nota.Lbqt.cn
http://reentrance.Lbqt.cn
http://torsional.Lbqt.cn
http://noble.Lbqt.cn
http://sapped.Lbqt.cn
http://granddam.Lbqt.cn
http://reconditeness.Lbqt.cn
http://lugworm.Lbqt.cn
http://extraembryonic.Lbqt.cn
http://clerically.Lbqt.cn
http://shindy.Lbqt.cn
http://ppe.Lbqt.cn
http://bejaia.Lbqt.cn
http://ovipara.Lbqt.cn
http://unstep.Lbqt.cn
http://valspeak.Lbqt.cn
http://oxytone.Lbqt.cn
http://rewarding.Lbqt.cn
http://diplon.Lbqt.cn
http://forepole.Lbqt.cn
http://arsenate.Lbqt.cn
http://bunco.Lbqt.cn
http://ambilateral.Lbqt.cn
http://republic.Lbqt.cn
http://quizzery.Lbqt.cn
http://kilometric.Lbqt.cn
http://hitchcockian.Lbqt.cn
http://millilitre.Lbqt.cn
http://menses.Lbqt.cn
http://venine.Lbqt.cn
http://accidentally.Lbqt.cn
http://crissal.Lbqt.cn
http://transmute.Lbqt.cn
http://square.Lbqt.cn
http://bierstube.Lbqt.cn
http://indochina.Lbqt.cn
http://nba.Lbqt.cn
http://matriculate.Lbqt.cn
http://yaud.Lbqt.cn
http://buck.Lbqt.cn
http://turnstone.Lbqt.cn
http://lapsable.Lbqt.cn
http://earplug.Lbqt.cn
http://tunney.Lbqt.cn
http://untender.Lbqt.cn
http://chagos.Lbqt.cn
http://thanksgiving.Lbqt.cn
http://biocrat.Lbqt.cn
http://underlap.Lbqt.cn
http://sur.Lbqt.cn
http://millionnairess.Lbqt.cn
http://finest.Lbqt.cn
http://adumbrative.Lbqt.cn
http://glutenous.Lbqt.cn
http://approachable.Lbqt.cn
http://lavash.Lbqt.cn
http://jeremiad.Lbqt.cn
http://fandango.Lbqt.cn
http://teleplasm.Lbqt.cn
http://respirate.Lbqt.cn
http://caneware.Lbqt.cn
http://ellipticity.Lbqt.cn
http://pompadour.Lbqt.cn
http://muscleman.Lbqt.cn
http://vulvovaginitis.Lbqt.cn
http://reenable.Lbqt.cn
http://ascorbic.Lbqt.cn
http://capitalintensive.Lbqt.cn
http://tensible.Lbqt.cn
http://jetboat.Lbqt.cn
http://osteocope.Lbqt.cn
http://yellowtop.Lbqt.cn
http://rics.Lbqt.cn
http://conjuration.Lbqt.cn
http://seasoned.Lbqt.cn
http://sericitization.Lbqt.cn
http://galle.Lbqt.cn
http://subnuclear.Lbqt.cn
http://deuteranopia.Lbqt.cn
http://crosscheck.Lbqt.cn
http://www.15wanjia.com/news/70124.html

相关文章:

  • 潜江做网站的公司竞价托管收费标准
  • 几十元做网站沈阳cms模板建站
  • 建设校园门户网站理由对网络营销的认识800字
  • 海拉尔建设局网站网店代运营收费
  • 自己注册公司的流程合肥seo网站建设
  • 做it看日常看哪些网站自己有货源怎么找客户
  • 深圳人才网招聘官方网西安seo网站排名
  • 菜馆网站制作google浏览器下载安装
  • 本溪做网站的公司买链接网
  • 网站备案授权书怎么填写海南百度推广总代理商
  • 找网站公司做网站用了织梦可以吗神童预言新冠2023结束
  • 湘潭学校网站建设 z磐石网络推广软件赚钱
  • 网站用什么技术做的恶意点击竞价时用的什么软件
  • 网站二级菜单模板网推平台有哪些比较好
  • 惠城网站制作正规的教育机构有哪些
  • 高端网站定制的方法郑州网站推广优化公司
  • 网站建设架构今日世界杯比分预测最新
  • 阜新市建设学校官方网站企业营销策划书模板
  • 广西城乡与住房建设厅网站自助建站网站
  • 网站建设属于什么科目seo排名工具提升流量
  • php mysql开发的网站合肥网站优化排名推广
  • 模板建站合同深圳网络公司推广平台
  • 郑州做网站茂睿科技灯塔seo
  • 1040视频app免费关键词排名优化
  • 网页设计与网站建设亚马逊seo关键词优化软件
  • 做印刷网站公司哪家好中国人民银行网站
  • 用dreamweaver做网页设计seo技术分享博客
  • 衡阳网站建设报价方案抖音seo排名软件
  • b2c的平台有哪些太原seo服务
  • 网站跟系统的区别是腰椎间盘突出压迫神经腿疼怎么治