• 设计模式--访问者模式C++实现


    访问者模式C++实现

    1定义Visitor Pattern

    封装一些作用于某种数据结构中各元素的操作,他可以在不改变数据结构的前提下定义作用于这些元素新的操作

    2类图

    角色分析

    Visitor抽象访问者,声明可以访问哪些元素,具体到程序中就是Visit方法参数定义哪些对象可以被访问

    ConcreteVisitor,他影响访问者访问到一个类之后该怎么做

    Element抽象元素,声明哪一个类访问者访问,程序上通过accept方法中的参数定义

    ConcreteElement实现accept方法,visitor.visit(this)基本形成一种模式

    ObjectStrture结构对象,元素产生者,一般容纳多个不同类,不同接口的容器,如list,set,map,在项目中一般很少抽象这个角色

    3实现

    class Element

    {

    protected:

      Element();

    public:

      void doSomething();

      void accept(Ivisitor visitor) = 0;

      virtual ~Element() = 0;

    };

    class ConcreteElement

    {

    public:

      void doSomething();

      void accept(IVisitor visitor)

      {

        visitor.visit(*this);

      }

    };

    class IVisitor

    {

    public:

      void Visitor(ConcreteElent el);

    };

    class Visitor:public IVisitor

    {

    public:

      void visit(Concrete el)

      {

        el.doSomething();

      }

    };

    //结构体对象

    class ObjectStuture

    {

    public:

      static Element createElement()

      {

        Random rand = new Random();

        return new ConcreteElement();

      }

    };

    4应用

    ①优点

    单一职责,Elementz子类加载数据,Visitor负责报表展示

    优秀的扩展性,增加数据操作是很方便的

    灵活性高,可以实现Element提供数据,Visitor对数据进行修饰并呈现

    ②缺点

    具体元素对访问者公布细节

    具体元素变更困难,因为要同时变更Visitor

    违背依赖倒置原则,访问者依赖具体元素而不是抽象元素

    ③使用场景

    一个对象结构包含很多类对象,他们接口不同,而你需要对其是实施的具体操作依赖具体类.迭代器模式不能胜任

    需要对一个结构体中的对象进行很多不同且不相关的操作,且不想操作 污染对象的类。

    ::业务规则要求遍历多个不同的对象,与迭代器模式对比。

    同时访问者模式也可以充当拦截器角色,在混编模式中

    5扩展

    ①统计功能

    将数据统计和批处理通过访问者模式进行处理

    ②多个访问者

  • 相关阅读:
    java根据图片路径下载到服务器方案 (转)
    什么是JSP (转)
    获取给定月中哪些天有聊天记录
    患者咨询服务区数据获取
    获取 不在当前设置录入状态,但是曾经设定过的测量指标 的最后测量日期
    MySQL 常用函数之——substr()
    MySql查询时间段的方法(转)
    MySQL 百万级分页优化(Mysql千万级快速分页)(转)
    mysql的sql分页函数limit使用 (转)
    MySql实现分页查询的SQL,mysql实现分页查询的sql语句 (转)
  • 原文地址:https://www.cnblogs.com/lang5230/p/5339554.html
Copyright © 2020-2023  润新知