您的位置:首页 > 编程语言 > Java开发

JAVA设计模式---访问者模式

2012-10-30 22:33 225 查看
访问者模式一般被用户一些数据结构稳定的场合,数据对象稳定,而实际对它的操作是不稳定的,他可以接受不同的对象而做出不同的反应,对与稳定的数据结构,它的功能和方法也就稳定,所以就把它抽象出来,抽取出来,而对于访问它的对象是经常改变的,传递不同的实际对象也就得到不同的运行效果,多态的体现

访问者模式的参与对象:

抽象节点:也就是稳定的数据结构对象,同时也声明具体数据结构对象的操作,操作方法接收访问者

具体节点:具体稳定数据结构的实现,接受访问者,调用访问者。

抽象访问者:对与不同的具体节点,做出相应的反应,具体节点是稳定的,从而访问者的一般具体操作也就相对稳定

具体访问者:具体实现对不同具体节点的操作

结构对象:封装起来的所有具体节点,当一个新的访问者增加的时候,只要调用结构对象的方法,就可以看到,他作用于所有具体节点上的效果。

类的实现:

//抽象节点

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);

//这样的话,上面情况,当增加新的访问者,只需要直接增加即可,不需要对节点等进行改变。

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: