设计模式之访问者模式(Visitor)

Visitor访问者模式定义
作用于某个对象群中各个对象的操作. 它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作.

 

   被访问者抽象类Node.java

package com.javapatterns.visitor.visitorsimplified;

abstract public class Node
{
    public abstract void accept(Visitor visitor);

    /** @link dependency */
    /*# Visitor lnkVisitorA; */
}

 

  被访问者实现类NodeA .java

package com.javapatterns.visitor.visitorsimplified;

public class NodeA extends Node
{
    public void accept(Visitor visitor)
    {
        visitor.visit(this);
    }

    public String operationA()
    {
        return "NodeA is visited";
    }
}

 

  被访问者实现类NodeB .java

package com.javapatterns.visitor.visitorsimplified;

public class NodeB extends Node
{
    public void accept(Visitor visitor)
    {
        visitor.visit(this);
    }

    public String operationB()
    {
       return "NodeB is visited";
    }
}

 

   访问者类Visitor.java

package com.javapatterns.visitor.visitorsimplified;

public class Visitor
{
    public void visit(NodeA nodeA)
    {
        System.out.println( nodeA.operationA() );
    }
    public void visit(NodeB nodeB)
    {
        System.out.println( nodeB.operationB() );
    }
}

 

  增加与迭代被访问者类ObjectStructure.java

package com.javapatterns.visitor.visitorsimplified;

import java.util.Vector;
import java.util.Enumeration;

public class ObjectStructure
{
    private Vector nodes;

    /**
     * @link aggregation 
     */
    private Node node;

    public ObjectStructure()
    {
        nodes = new Vector();
    }

    public void action(Visitor visitor)
    {
        for(Enumeration e = nodes.elements();
        	e.hasMoreElements();)
        {
            node = (Node) e.nextElement();
            node.accept(visitor);
        }
    }

    public void add(Node node)
    {
        nodes.addElement(node);
    }
}

 

  客户端类Client.java

package com.javapatterns.visitor.visitorsimplified;

public class Client
{
    private static ObjectStructure aObjects;
    private static Visitor visitor;

    static public void main(String[] args)
    {
        aObjects = new ObjectStructure();

        aObjects.add(new NodeA());
        aObjects.add(new NodeB());

        visitor = new Visitor();
        aObjects.action(visitor);

    }
}

 

   这种设计模式一般是用在数据类型固定不变的情况下,其实我很想把访问者模式用在通用页面的数据访问中,因为所有的

   网页无非就是下拉,文本,单选,多选,文件等可以确定的数据结构,然后其做成标签,在后台action取值的时候,只要

   把这些标签类put到ObjectStructure中,就可以取到值。目前正在思考,如何很好的实现。如果这样实现,那么扩展

   的时候,既可以满足开闭 原则,当然也满足松耦合性的原则。

   其次:访问者模式与适配器模式相结合,那么就可以更加完美的体现开闭原则。如果多一种类型,只要再接口中增加一个

   方法,就可以自如的使用了。呵呵,很好的哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值