访问者模式一般被用户一些数据结构稳定的场合,数据对象稳定,而实际对它的操作是不稳定的,他可以接受不同的对象而做出不同的反应,对与稳定的数据结构,它的功能和方法也就稳定,所以就把它抽象出来,抽取出来,而对于访问它的对象是经常改变的,传递不同的实际对象也就得到不同的运行效果,多态的体现
访问者模式的参与对象:
抽象节点:也就是稳定的数据结构对象,同时也声明具体数据结构对象的操作,操作方法接收访问者
具体节点:具体稳定数据结构的实现,接受访问者,调用访问者。
抽象访问者:对与不同的具体节点,做出相应的反应,具体节点是稳定的,从而访问者的一般具体操作也就相对稳定
具体访问者:具体实现对不同具体节点的操作
结构对象:封装起来的所有具体节点,当一个新的访问者增加的时候,只要调用结构对象的方法,就可以看到,他作用于所有具体节点上的效果。
类的实现:
//抽象节点
public interface Node {
//抽象节点接受不同访问者产生相应的结果
void accept(Visitor visitor);
}
//具体节点,具体节点一般是有限的,因为数据结构是稳定,比如人类,具体只能是男人女人
public class NodeMan implements Node{
public void accept(Visitor visitor) {
System.out.println(this.getClass().getName() + "对" + visitor.getClass().getName() + "的反应" + visitor.operate(this));
}
}
public class NodeWomen implements Node{
public void accept(Visitor visitor) {
System.out.println(this.getClass().getName() + "对" + visitor.getClass().getName() + "的反应" + visitor.operate(this));
);
}
}
//抽象访问者,对每个节点做出的相应,即时每个节点接受不同访问者的反应
public interface Visitor {
void operator(NodeA node);
void operator(NodeB node);
}
public class VisitorA implements Visitor {
public void operator(NodeA node) {
System.out.println(this.getClass().getName() + "作用于" + node.getClass().getName() + "的效果");
}
public void operator(NodeB node) {
System.out.println(this.getClass().getName() + "作用于" + node.getClass().getName() + "的效果");
}
}
public class VisitorB implements Visitor {
public void operator(NodeA node) {
System.out.println(this.getClass().getName() + "作用于" + node.getClass().getName() + "的效果");
}
public void operator(NodeB node) {
System.out.println(this.getClass().getName() + "作用于" + node.getClass().getName() + "的效果");
}
}
//结构对象,封装了所有具体节点,一简化在客户端调用的时候,每个访问者传递过来,还需要一次作用于每个具体节点,有了结构对象,调用它的方法,他会帮你遍历所有的节点对象,做出对访问者的反应结果
public class StructObject {
private List<Node> nodes = new ArrayList<Node>();
public StructObject() {};
public void addNode(Node node) {
this.nodes.add(node);
}
public void accpetVisitor(Visitor visitor) {
for(Node node:nodes) {
node.accept(visitor);
}
}
}
客户端调用实现:
public class Test {
public static void main(String[] args) {
StructObject s = new StructObject();
NodeA a = new NodeA();
NodeB b = new NodeB();
s.addNode(a);
s.addNode(b);
//一般上面的情况就是很稳定的了,因为节点对象是稳定数据结构
VisitorA a1 = new VisitorA();
s.acceptVistor(a1);
VisitorB a2 = new VisitorB();
s.acceptVistor(a2);
//这样的话,上面情况,当增加新的访问者,只需要直接增加即可,不需要对节点等进行改变。
}
}
分享到:
相关推荐
总的来说,`C++设计模式代码资源24_Vistor_访问器.zip`提供了一个学习和实践C++访问者模式的实例,通过`Visitor1.cpp`和`Visitor2.cpp`的代码,我们可以深入理解如何在实际项目中运用这一模式,提高代码的灵活性和可...
### C++设计模式之访问者(Vistor)模式解析 #### 概述 在软件开发领域,设计模式作为解决特定问题的最佳实践集合被广泛应用。其中,“访问者(Visitor)”模式是面向对象设计中的一种常用模式,它允许我们向一组...
访问者模式是封装一些施加于某种数据结构之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保存不变。 访问者模式适用于数据结构相对稳定的系统, 它把数据结构和作用于数据结构之上的操作之间的...
访问者模式是一种设计模式,属于行为模式类别,其主要目的是在不修改对象结构的前提下,为对象结构中的元素提供新的操作。这种模式的核心思想是将数据结构与数据操作分离,使得增加新的操作变得容易,同时也避免了对...
**C#设计模式之Visitor** **一、设计模式概述** 设计模式是软件开发中的经验总结,它提供了解决常见问题的可复用解决方案。在C#编程中,设计模式可以帮助我们编写更灵活、可扩展和易于维护的代码。"Visitor"(访问...
访问者设计模式是一种在软件工程领域广泛使用的结构型设计模式,尤其在面对复杂的对象结构时,它能够将数据结构与对这些数据结构的操作分离。这种模式的核心思想是将操作行为添加到对象结构中的元素,而无需修改这些...
6. **访问者模式(Vistor)**:访问者模式允许在不修改对象结构的情况下,向对象添加新的操作。`Vistor.h`可能包含了一个访问者接口,定义了对每个元素的访问行为,以及被访问元素的接口,接受并处理访问者。 7. **...
Tivoli Storage Manager (TSM) 是IBM推出的一款强大的企业级数据保护解决方案,而Vistor软件则常用于模拟磁带库,配合TSM进行虚拟化的备份操作。本文将详细阐述如何使用Vistor软件与TSM进行安装和配置,以构建一个...
【vistor虚拟带库在Linux环境下的安装与配置】 虚拟带库(Virtual Tape Library, VTL)是一种将硬盘存储模拟成磁带库的技术,它提供了与磁带库类似的备份和恢复功能,但速度更快,效率更高。Vistor是其中一种虚拟带...
在本案例中,"vistor虚拟带库安装程序"是专为Linux操作系统设计的一款软件,用于在Linux环境下搭建和管理虚拟带库。 首先,我们需要理解Linux系统的基础知识。Linux是一种开源的操作系统,广泛应用于服务器、数据...
前言 在实际开发时,面对一个大的系统,总是会将一个大的系统分成若干个子系统,等子系统完成之后,再分别调用对应的子系统来完成对应的整体功能,这样有利于降低系统的复杂性;最终进行实现某个具体的功能时,我们...
近期学习tsm备份,用vistor虚拟带库搭建实验环境。文档涵盖了整个环境的搭建过程,每一步很详细。
Visitor 模式是一种行为型设计模式,它允许在不修改已有的类层次的情况下,增加新的操作或行为。这种模式可以使得开发者在不改变原有类层次的情况下,能够对对象进行不同的处理。 从给定的文件信息中,我们可以...
JavacTo是一个原型工具,旨在评估将Java... 提供了三个访问者类,以学习如何使用JavacTo和编写访问者类。 可以在以下位置获得Vistor javadocs:http://docs.oracle.com/javase/8/docs/jdk/api/javac/tree/index.html
HKU vistor map and guide
2. **UV (Unique Vistor)**(独立访客):访问网站的不重复用户数量,即使同一人在不同时间访问也会被计为多个UV。 3. **PV (PageView)**(页面浏览量):记录用户在网站上查看页面的总次数,同一用户多次访问同一...