設計模式之訪問者模式

訪問者模式涉及的角色如下:

1  抽象訪問者(Visitor)角色:聲明瞭一個或多個方法操作,形成所有具體訪問者角色必須實現的接口。

2  具體訪問者(ConcreteVisitor)角色:實現抽象訪問在所聲明的接口,也就是抽象訪問者所聲明的各個訪問操作。

3  抽象節點(Node)角色:聲明一個接受操作,接受一個訪問者對象所爲一個參數

4  具體節點(ConcreteNode)角色:實現了抽象節點所規定的接受操作。

5  結構對象(ObjectStructure)角色:有如下的責任,可以遍歷結構中的所有元素;如果需要,

   提供一個高層次接口讓訪問者對象可以訪問每一個元素,可以設計成一個複合對象或一個聚集,List或set

Visitor:抽象層

public interface Visitor {
    /**
     * 對應於NodeA的訪問操作
     */
    public void visit(NodeA node);
    /**
     * 對應於NodeB的訪問操作
     */
    public void visit(NodeB node);
}


具體訪問者:
public class VisitorA implements Visitor {
    /**
     * 對應於NodeA的訪問操作
     */
    @Override
    public void visit(NodeA node) {
        System.out.println(node.operationA());
    }
    /**
     * 對應於NodeB的訪問操作
     */
    @Override
    public void visit(NodeB node) {
        System.out.println(node.operationB());
    }

}

public class VisitorB implements Visitor {
    /**
     * 對應於NodeA的訪問操作
     */
    @Override
    public void visit(NodeA node) {
        System.out.println(node.operationA());
    }
    /**
     * 對應於NodeB的訪問操作
     */
    @Override
    public void visit(NodeB node) {
        System.out.println(node.operationB());
    }

}

抽象節點類:
public abstract class Node {
    /**
     * 接受操作
     */
    public abstract void accept(Visitor visitor);
}


具體節點:


public class NodeA extends Node{
    /**
     * 接受操作
     */
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
    /**
     * NodeA特有的方法
     */
    public String operationA(){
        return "NodeA";
    }


}


public class NodeB extends Node{
    /**
     * 接受方法
     */
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
    /**
     * NodeB特有的方法
     */
    public String operationB(){
        return "NodeB";
    }
}

結構對象角色類:這個結構對象角色持有一個聚集,並向外界提供add()方法作爲對聚集的管理操作。通過調用這個方法,可以動態地增加一個新的節點。


public class ObjectStructure {
    
    private List<Node> nodes = new ArrayList<Node>();
    
    /**
     * 執行方法操作
     */
    public void action(Visitor visitor){
        
        for(Node node : nodes)
        {
            node.accept(visitor);
        }
        
    }
    /**
     * 添加一個新元素
     */
    public void add(Node node){
        nodes.add(node);
    }
}

 客戶端
public class Client {
    public static void main(String[] args) {
        //創建一個結構對象
        ObjectStructure os = new ObjectStructure();
        //給結構增加一個節點
        os.add(new NodeA());
        //給結構增加一個節點
        os.add(new NodeB());
        //創建一個訪問者
        Visitor visitor = new VisitorA();
        os.action(visitor);
    }


}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章