设计模式之访问者模式

22 篇文章 1 订阅

访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。它包括以下角色:

1.访问者角色(Visitor):为该对象结构中ConcreteElement的每一个类声明一个Visit方法。

2.具体访问者角色(ConcreteVisitor):实现每个由Visitor声明的操作。每个操作实现算法的一部分。

3.元素角色(Element):定义一个Accept操作,它以一个访问者为参数。

4.具体元素(ConcreteElement):实现Accept操作。

5.对象结构角色(ObjectStructure):能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。

UML图如下:


代码如下:

访问者角色代码(Visitor):

public interface Visitor
{
    //访问元素A的操作
    void visitConcreteElementA(ConcreteElementA concreteElement);
    //访问元素B的操作
    void visitConcreteElementB(ConcreteElementB ConcreteElement);
}
具体访问者角色代码(ConcreteVisitor):

public class ConcreteVisitorA implements Visitor
{
    public void visitComcrecteElementA(ComcrecteElementA comcrecteElement)
    {
        System.out.println( comcrecteElement.operationA() );
    }
    public void visitComcrecteElementB(ComcrecteElementB comcrecteElement)
    {
        System.out.println( comcrecteElement.operationB() );
    }
}
    
public class ComcreteVisitorB implements Visitor
{
     public void visitComcrecteElementA(ComcrecteElementA comcrecteElement)
    {
        System.out.println( comcrecteElement.operationA() );
    }
    public void visitComcrecteElementB(ComcrecteElementB comcrecteElement)
    {
        System.out.println( comcrecteElement.operationB() );
    }
}
元素角色(Element)代码:

public abstract class Element
{
    public abstract void accept(Visitor visitor);
}
具体元素角色(ConcreteElement)代码:

public class ConcreteElementA extends Element
{
    public void accept(Visitor visitor)
    {
        visitor.visitConcreteElementA(this);
    }
 
    public String operationA()
    {
        return "ConcreteElementA is visited";
    }
}
 
public class ConcreteElementB extends Element
{
    public void accept(Visitor visitor)
    {
        visitor.visitConcreteElementB(this);
    }
 
    public String operationB()
    {
       return "ConcreteElementB is visited";
    }
}

对象结构角色(ObjectStructure)代码:

public class ObjectStructure
{
    private Vector vector;
    private Element element;
    //构造方法
     public ObjectStructure()
    {
        vector = new Vector();
    }
    //执行访问操作
     public void action(Visitor visitor)
    {
        for(Enumeration e = vector.elements();e.hasMoreElements();)
        {
            element = (Element)e.nextElement();
            element.accept(visitor);
        }
    }
    //增加一个新元素
     public void add(Element element)
    {
        vector.addElement(element);
    }
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值