访问者模式:
表示一个 作用于 某对象结构中的各元素的操作,它可以是你在 不改变
各元素的类的前提下定义 作用于这些元素的新操作。
访问模式适用于:数据结构相对稳定的系统。
他把数据结构和作用于结构上的操作直接的耦合解脱开,使得操作集合可以相对自由地 演化。
访问者的目的是要把处理 从数据结构分离出来。
访问者模式 得优点就是增加新得操作很容易,因为增加新得操作 就意味着增加 一个新得访问者,
访问者模式 将有关得行为集中到 一个访问者对象中。同时,访问者得缺点就是 使增加新得数据
结构变得困难了。(只有真的需要了才会用)
/**
* 定义一个 Accept 操作,它以一个访问者为参数
* */
abstract class Element {
public abstract void Accept(Visitor visitor);
}
/**
* 具体元素,实现Accept操作
* */
public class ConcreteElementA extends Element{
@Override
public void Accept(Visitor visitor) {
visitor.VisitConcreteElementA(this);
}
// 其他相关得方法
public void operationA() {}
}
/**
* 具体元素,实现Accept操作
* */
public class ConcreteElementB extends Element{
@Override
public void Accept(Visitor visitor) {
visitor.VisitConcreteElementB(this);
}
// 其他得相关方法
public void operationB() {}
}
/**
* 为该对象结构 种 ConcreteElement 的每一个类声明一个Visit 操作。
* */
abstract class Visitor {
public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);
public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);
}
/**
* 具体访问者,实现每个 有 Visitor 声明得操作,每个操作实现算法得一部分,而该算法 片段
* 乃是 对 结构种对象得类
* **/
public class ConcreteVisitorA extends Visitor{
@Override
public void VisitConcreteElementA(ConcreteElementA concreteElementA) {
// TODO Auto-generated method stub
System.out.println("beifangwenA");
}
@Override
public void VisitConcreteElementB(ConcreteElementB concreteElementB) {
// TODO Auto-generated method stub
System.out.println("beifangwenB");
}
}
/**
* 具体访问者,实现每个 有 Visitor 声明得操作,每个操作实现算法得一部分,而该算法 片段
* 乃是 对 结构种对象得类
* **/
public class ConcreteVisitorB extends Visitor{
@Override
public void VisitConcreteElementA(ConcreteElementA concreteElementA) {
// TODO Auto-generated method stub
System.out.println("beifangwenA");
}
@Override
public void VisitConcreteElementB(ConcreteElementB concreteElementB) {
// TODO Auto-generated method stub
System.out.println("beifangwenB");
}
}
/**
* 能枚举它得元素。可以提供一个高层得接口允许访问者访问它得元素
* */
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ObjectStructure {
private List<Element> list=new ArrayList<>();
public void attach(Element element) {
list.add(element);
}
public void delete(Element element) {
list.remove(element);
}
public void accept(Visitor visitor) {
for (Element element : list) {
element.Accept(visitor);
}
}
}
/**
* 客户端
* */
public class Test1 {
public static void main(String[] args) {
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.attach(new ConcreteElementA());
objectStructure.attach(new ConcreteElementB());
ConcreteVisitorA concreteVisitorA = new ConcreteVisitorA();
ConcreteVisitorB concreteVisitorB = new ConcreteVisitorB();
objectStructure.accept(concreteVisitorB);
objectStructure.accept(concreteVisitorA);
}
}