3.11设计模式——Visitor 访问者模式(行为型)

embedded/2024/9/23 10:28:48/

意图

表示一个作用于某对象结构中的各元素的操作。它允许在不改变各元素的类的前提下定义作用于这些元素的新操作。

结构

  • Visitor(访问者)为该对象结构中ConcreteElement(具体元素)的每一个类声明一个Visit操作,该操作的名字和特征标识了发送Visit请求给该访问者的那个类,这使得访问者可以确定正被访问元素的具体的类。这样访问者就可以通过该元素的特定接口直接访问它。
  • ConcreteVisitor(具体访问者)实现每个有Visitor声明的操作,每个操作实现本算法的一部分,而算法片段乃是对应于结构中对象的类。ConcreteVisitor为该算法提供了上下文并存储它的局部状态。这一状态常常在遍历该结构的过程中累计结果。
  • Element(元素)定义以一个访问者为参数的Accept操作。
  • ConcreteElement(具体元素)实现以一个访问者为参数的Accept操作。
  • ObjectStructure(对象结构)能枚举它的元素;可以提供一个高层的接口以允许该访问者访问它的元素;可以是一个组合或者是一个集合,如一个列表或一个无序集合。

适用性

  • 一个对象结构包含很多类对象,它们有不同的接口,而用户想对这些对象实施一些依赖于具体类的操作。
  • 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而又想要避免这些操作污染这些对象的类,Visitor使得用户可以将相关的操作集中起来定义再一个类中。当该对象结构被很多应用共享是,用Visitor模式让每个应用仅包含需要用到的操作。
  • 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对独有访问者的接口,这可能需要很大的代价。如果对象结构经常改变,那么可能还是在这些类中定义这些操作较好。

代码示例

java">// Element接口
interface Element {void accept(Visitor visitor);
}// ConcreteElement具体元素类
class ConcreteElementA implements Element {@Overridepublic void accept(Visitor visitor) {visitor.visitConcreteElementA(this);}
}class ConcreteElementB implements Element {@Overridepublic void accept(Visitor visitor) {visitor.visitConcreteElementB(this);}
}// Visitor访问者接口
interface Visitor {void visitConcreteElementA(ConcreteElementA element);void visitConcreteElementB(ConcreteElementB element);
}// ConcreteVisitor具体访问者类
class ConcreteVisitor implements Visitor {@Overridepublic void visitConcreteElementA(ConcreteElementA element) {System.out.println("访问者正在访问 ConcreteElementA");}@Overridepublic void visitConcreteElementB(ConcreteElementB element) {System.out.println("访问者正在访问 ConcreteElementB");}
}// ObjectStructure对象结构类
class ObjectStructure {private List<Element> elements = new ArrayList<>();public void addElement(Element element) {elements.add(element);}public void removeElement(Element element) {elements.remove(element);}public void accept(Visitor visitor) {for (Element element : elements) {element.accept(visitor);}}
}// 示例用法
public class VisitorPatternExample {public static void main(String[] args) {ObjectStructure objectStructure = new ObjectStructure();objectStructure.addElement(new ConcreteElementA());objectStructure.addElement(new ConcreteElementB());Visitor visitor = new ConcreteVisitor();objectStructure.accept(visitor);}
}
  1. Element(元素)接口定义了一个接受访问者的方法 accept(Visitor visitor),该方法允许访问者访问元素。

  2. ConcreteElementA 和 ConcreteElementB 是具体元素类,它们实现了 Element 接口,并在 accept 方法中调用访问者的相应方法,将自身作为参数传递给访问者。

  3. Visitor(访问者)接口声明了访问具体元素的方法,例如 visitConcreteElementA 和 visitConcreteElementB

  4. ConcreteVisitor(具体访问者)类实现了 Visitor 接口,提供了对具体元素的访问方法的具体实现。

  5. ObjectStructure(对象结构)类维护了一个元素列表,并提供了一个接受访问者的方法 accept,在该方法中遍历元素列表,调用每个元素的 accept 方法,让访问者访问每个元素。


http://www.ppmy.cn/embedded/28252.html

相关文章

javascrip对象如何区分属性和方法

在JavaScript中&#xff0c;对象是由属性和方法构成的。属性是对象的特征或状态&#xff0c;而方法是对象能够执行的动作。 属性的特点&#xff1a; 属性是对象的成员&#xff0c;用来描述对象的状态或特征。属性可以是基本数据类型&#xff08;如字符串、数字、布尔值等&…

引入classfinal maven 插件实现对jar包的加密

文章目录 概要整体流程 概要 我使用的项目为微服务项目 整体流程 明确所有需要加密的jar包&#xff1a; 可以通过maven的package指令&#xff0c;查看日志&#xff0c;后缀为jar的即为所有需要加密的jar包。 在跟pom文件的properties属性中定义classfinal maven插件的属性值…

记录浏览器打开网站拦截提示不安全解决方法

浏览器可能会因为多种原因显示“不安全”的警告,这通常是由于安全设置不当或配置错误造成的。以下是一些常见的原因和解决方法: 1. HTTPS未启用 原因:如果网站使用HTTP而不是HTTPS,浏览器可能会显示不安全的警告。 解决方法:配置SSL/TLS证书并使用HTTPS来加密数据传输…

OpenHarmony实战开发-如何实现单一手势

点击手势&#xff08;TapGesture&#xff09; TapGesture(value?:{count?:number; fingers?:number})点击手势支持单次点击和多次点击&#xff0c;拥有两个可选参数&#xff1a; count&#xff1a;声明该点击手势识别的连续点击次数。默认值为1&#xff0c;若设置小于1的非…

中国发布首个汽车大模型标准

&#x1f989; AI新闻 &#x1f680; 中国发布首个汽车大模型标准 摘要&#xff1a;中国信息通信研究院于4月28日发布了国内首个汽车大模型标准&#xff0c;标志着汽车行业正式迈向“人工智能&#xff0b;”时代。该标准包含三个核心能力域&#xff1a;场景丰富度、能力支持度…

AtCoder Beginner Contest 351(补题A~F)

文章目录 A - The bottom of the ninth思路&#xff1a;代码&#xff1a; B - Spot the Difference思路&#xff1a;代码&#xff1a; C - Merge the balls思路&#xff1a;代码&#xff1a; D - Grid and Magnet思路&#xff1a; E - Jump Distance Sum思路&#xff1a;代码&a…

Spark-机器学习(7)分类学习之决策树

在之前的文章中&#xff0c;我们学习了分类学习之支持向量机&#xff0c;并带来简单案例&#xff0c;学习用法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。…

jvm面试题30问

什么是JVM的跨平台&#xff1f; 什么是JVM的语言无关性&#xff1f; 什么是JVM的解释执行 什么是JIT? JIT&#xff1a;在Java编程语言和环境中&#xff0c;即时编译器&#xff08;JIT compiler&#xff0c;just-in-time compiler&#xff09;是一个把Java的字节码&#xff08;…