码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之访问者模式

时间:2015-04-07 11:59:54      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:设计模式

访问者模式涉及的角色如下:


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


}



设计模式之访问者模式

标签:设计模式

原文地址:http://blog.csdn.net/chengxuyuanqiangzi/article/details/44917645

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!