visitor parttern (third day)

来源:互联网 发布:java socket经常断开 编辑:程序博客网 时间:2024/06/08 00:28

visitor  抽象访问者

抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法的参数定义哪些对象可以被访问的。

concreteVisitor   具体访问者
它影响访问者访问到一个类后该怎么干,要做什么事情。

element 抽象元素
接口或者抽象类,声明接受那一类访问者访问,程序上市通过accept方法中的参数来定义的。

concreteElement 具体元素
实现accept 方法,通常是visitor。visit(this) 基本上都形成了一种模式了

objectStruture 结构对象

 元素产生者,一般容纳在多个不同类,不同接口的容器

访问者 访问什么?

被访问者 接受  谁访问?



public class Client {private static ObjectStructure aObjects;private static Visitor visitor;public static void main(String[] args) {aObjects = new ObjectStructure();aObjects.add(new NodeA());aObjects.add(new NodeB());visitor = new VisitorA();aObjects.action(visitor);}}

public interface Visitor {//访问者 访问什么?void visit(NodeA node);void visit(NodeB node);}

public class VisitorA implements Visitor{@Overridepublic void visit(NodeA node) { System.out.println(node.operationA());}@Overridepublic void visit(NodeB node) { System.out.println(node.operateionB());}}

public class VisitorB implements Visitor{public void visit(NodeA nodeA){System.out.println(nodeA.operationA());}@Overridepublic void visit(NodeB node) {System.out.println(node.operateionB());}}
abstract public class Node {//接受谁 访问public abstract void accept(Visitor visitor);}

public class NodeA extends Node{ @Overridepublic void accept(Visitor visitor) {visitor.visit(this);}public String operationA(){return "NodeA is visited";}}

public class NodeB extends Node{@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}public String operateionB(){return "Node B is visited";}}

import java.util.Enumeration;import java.util.Vector;/**     聚集:被访问者要接受那些访问者访问 *  * @describe * @time 2014-7-2 上午11:47:11 */public class ObjectStructure {private Vector<Node> nodes;private Node node;public ObjectStructure(){nodes  = new Vector();}public void action(Visitor visitor){for(Enumeration<Node> e = nodes.elements();e.hasMoreElements();){node = e.nextElement();node.accept(visitor);}}public void add(Node node){nodes.addElement(node);}}

0 0