visitor设计模式ppt_常用的设计模式

visitor设计模式ppt_常用的设计模式动机Visitor是访问者的意思。数据结构中保存着元素。一般我们需要对元素进行处理,那么处理元素的代码放在哪里呢?最显然的方法就是放在数据结构的类中,在类中添加处理的方法。但是如果有很多处理,就比较麻烦了,每当增加一种处理,我们就不得不去修改表示数据结构的类。visitor模式就是用来解决这个问题的,visitor模式将数据结构的定义和处理分离开。也就是会新增一个访问者的类,将数据元素的处理交给访问者类,这样以后要新增处理的时候,只需要新增访问者就可以了。模式定义将更新(变更)封装到一个类中(访问

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

动机

Visitor是访问者的意思。
数据结构中保存着元素。一般我们需要对元素进行处理,那么处理元素的代码放在哪里呢?最显然的方法就是放在数据结构的类中,在类中添加处理的方法。但是如果有很多处理,就比较麻烦了,每当增加一种处理,我们就不得不去修改表示数据结构的类。
visitor模式就是用来解决这个问题的,visitor模式将数据结构的定义和处理分离开。也就是会新增一个访问者的类,将数据元素的处理交给访问者类,这样以后要新增处理的时候,只需要新增访问者就可以了。

模式定义

将更新(变更)封装到一个类中(访问操作),并由待更改类提供一个接收接口,则可达到效果。

实例

//visit.h
 
#ifndef VISITOR_H
#define VISITOR_H
 
#include <iostream>
#include <string>
#include <vector>
 
class Element;
class CPU;
class VideoCard;
class MainBoard;
 
/*------------------*/
class Visitor { 
   
public:
    Visitor(std::string name) { 
   
        visitorName = name;
    }
    virtual void visitCPU( CPU* cpu ) { 
   };
    virtual void visitVideoCard( VideoCard* videoCard ) { 
   };
    virtual void visitMainBoard( MainBoard* mainBoard ) { 
   };
 
 
    std::string getName() { 
   
        return this->visitorName;
    };
private:
    std::string visitorName;
};
 
 
class Element { 
   
public:
    Element( std::string name ) { 
   
        eleName = name;
    }
    virtual void accept( Visitor* visitor ) { 
   };
 
    virtual std::string getName() { 
   
        return this->eleName;
    }
private:
    std::string eleName;
};
 
/*----------- Elements -------------*/
 
class CPU : public Element { 
   
public:
    CPU(std::string name) : Element(name) { 
   }
 
    void accept(Visitor* visitor) { 
   
        visitor->visitCPU(this);
    }
};
 
class VideoCard : public Element { 
   
public:
    VideoCard(std::string name) : Element(name) { 
   }
 
    void accept(Visitor* visitor) { 
   
        visitor->visitVideoCard(this);
    }
};
 
class MainBoard : public Element { 
   
public:
    MainBoard(std::string name) : Element(name) { 
   }
      
    void accept(Visitor* visitor) { 
   
        visitor->visitMainBoard(this);
    }
};
 
/*----------- ConcreteVisitor -------------*/
 
class CircuitDetector : public Visitor { 
   
public:
    CircuitDetector(std::string name) : Visitor(name) { 
   }
 
    // checking cpu
    void visitCPU( CPU* cpu ) { 
   
        std::cout << Visitor::getName() << " is checking CPU's circuits.(" << cpu->getName()<<")" << std::endl;
    }
 
    // checking videoCard
    void visitVideoCard( VideoCard* videoCard ) { 
   
        std::cout << Visitor::getName() << " is checking VideoCard's circuits.(" << videoCard->getName()<<")" << std::endl;
    }
 
    // checking mainboard
    void visitMainBoard( MainBoard* mainboard ) { 
   
        std::cout << Visitor::getName() << " is checking MainBoard's circuits.(" << mainboard->getName() <<")" << std::endl;
    }
 
};
 
class FunctionDetector : public Visitor { 
   
public:
    FunctionDetector(std::string name) : Visitor(name) { 
   }
    virtual void visitCPU( CPU* cpu ) { 
   
        std::cout << Visitor::getName() << " is check CPU's function.(" << cpu->getName() << ")"<< std::endl;
    }
 
    // checking videoCard
    void visitVideoCard( VideoCard* videoCard ) { 
   
        std::cout << Visitor::getName() << " is checking VideoCard's function.(" << videoCard->getName()<< ")" << std::endl;
    }
 
    // checking mainboard
    void visitMainBoard( MainBoard* mainboard ) { 
   
        std::cout << Visitor::getName() << " is checking MainBoard's function.(" << mainboard->getName() << ")"<< std::endl;
    }
};
 
 
/*------------------------*/
 
class Computer { 
   
public:
    Computer(CPU* cpu,
            VideoCard* videocard,
            MainBoard* mainboard) { 
   
        elementList.push_back(cpu);
        elementList.push_back(videocard);
        elementList.push_back(mainboard);
    };
    void Accept(Visitor* visitor) { 
   
        for( std::vector<Element*>::iterator i = elementList.begin(); i != elementList.end(); i++ )
        { 
   
            (*i)->accept(visitor);
        }
    }; 
private:
    std::vector<Element*> elementList;
};

结构

加粗样式

笔记

  • 就是将数据结构和操作 分离开
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168496.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java prototype是什么,Java设计模式之原型模式(Prototype模式)介绍

    java prototype是什么,Java设计模式之原型模式(Prototype模式)介绍Prototype模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。如何使用原型模式因为Java中的提供clone()方法来实现对象的克隆,所以Prototype模式…

    2025年6月14日
    7
  • 一句话评论设计模式六大原则

    原则,故名思议则是本质的意思。所谓擒贼先擒王,研究设计模式自然要先了解设计原则,所有的模式都是在这些原则的基础之上发展起来的,有的是侧重一个,有的是多个都有所涉及。看完设计模式之后,我感觉到每个模式都

    2021年12月25日
    43
  • JAVA设计模式之单例模式

    本文继续介绍23种设计模式系列之单例模式。概念:  java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。  单例模式有以下特点:  1、单例类只能有一个实例。  2、单例类必须自己创建自己的唯一实例。  3、单例类必须给所有其他对象提供这一实例。  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例…

    2022年3月11日
    40
  • 前端开发中常用的几种设计模式有哪些_设计模式原理

    前端开发中常用的几种设计模式有哪些_设计模式原理设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。设计模式更多的是指导思想和方法论,而不是现成的代码,当然每种设计模式都有每种语言中的具体实现方式。学习设计模式更多的是理解各种模式的内在思想和解决的问题,毕竟这是前人无数经验总结成的最佳实践,而代码实现则是对加深理解的辅助。设计模式可以分为三大类:结构型模式(StructuralPatterns):通过识别系统中组件间的简单关系来简化系统的设计。 创建型模式(CreationalPatterns):处理对象的创..

    2025年7月28日
    5
  • 设计模式学习总结——观察者模式「建议收藏」

    设计模式学习总结——观察者模式

    2022年1月25日
    74
  • 【设计模式】Template Method模式

    【设计模式】Template Method模式

    2022年1月15日
    58

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号