访问者模式

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

UML图如下:

Vistor:为该对象结构中的ConcreteElement的每一个类声明一个visit操作。

ConcreteVistor:具体访问者,实现每个由Visitor声明的操作。每个操作实现算法的一部分,而该算法片段乃是对应于结构中对象的类。

Elment:定义一个accept的操作,它以一个访问者为参数

ConcreteElement:具体元素,实现Accept操作

ObjectStructure:能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素

具体代码如下:

1、Visitor类

<span style="font-size:18px;">public abstract class Visitor
{
abstract void visitConcreteElementA(ConcreteElementA elementA);
abstract void visitConcreteElementB(ConcreteElementB elementB);
}</span>
2、Element类

<span style="font-size:18px;">public abstract class Element
{
	abstract void accept(Visitor visitor);
}
</span>
3、具体Element类

<span style="font-size:18px;">public class ConcreteElementA extends Element
{

	@Override
	void accept(Visitor visitor)
	{
		// TODO Auto-generated method stub
		visitor.visitConcreteElementA(this);
	}

}

class ConcreteElementB extends Element
{

    @Override
    void accept(Visitor visitor)
    {
        // TODO Auto-generated method stub
        visitor.visitConcreteElementB(this);
    }

} </span>
4、具体Visitor类

<span style="font-size:18px;">public class ConcreteVisitorA extends Visitor
{

	@Override
	void visitConcreteElementA(ConcreteElementA elementA)
	{
		// TODO Auto-generated method stub
		System.out.println(this.getClass().getName().substring(23)+"访问"+elementA.getClass().getName().substring(23));
		
	}

	@Override
	void visitConcreteElementB(ConcreteElementB elementB)
	{
		// TODO Auto-generated method stub
		System.out.println(this.getClass().getName().substring(23)+"访问"+elementB.getClass().getName().substring(23));
	}

}

class ConcreteVisitorB extends Visitor
{

    @Override
    void visitConcreteElementA(ConcreteElementA elementA)
    {
        // TODO Auto-generated method stub
        System.out.println(this.getClass().getName().substring(23)+"访问"+elementA.getClass().getName().substring(23));
        
    }

    @Override
    void visitConcreteElementB(ConcreteElementB elementB)
    {
        // TODO Auto-generated method stub
        System.out.println(this.getClass().getName().substring(23)+"访问"+elementB.getClass().getName().substring(23));
    }

}
 </span>
5、ObjectStructure类

<span style="font-size:18px;">import java.util.ArrayList;
import java.util.List;

public class ObjectStructure
{
	private List<Element> elements = new ArrayList<Element>();

	public void attach(Element element)
	{
		elements.add(element);
	}

	public void detach(Element element)
	{
		elements.remove(element);
	}
	public void accept(Visitor visitor)
	{
		for(Element e:elements)
		{
			e.accept(visitor);
		}
	}

}</span>

6、Client类

<span style="font-size:18px;">public class Client
{
	public static void main(String[] args)
	{
		ObjectStructure o = new ObjectStructure();
		o.attach(new ConcreteElementA());
		o.attach(new ConcreteElementB());
		
		ConcreteVisitorA va=new ConcreteVisitorA();
		ConcreteVisitorB vb=new ConcreteVisitorB();
		o.accept(va);
		o.accept(vb);
		
	}

}
</span>

      访问者模式适用于数据结构相对稳定的系统,它的目的是把处理从数据结构分离出来。

      优点:在于很容易增加新的操作。因为增加新的操作就意味着增加一个新的访问者,访问者模式将有关的行为集中到一个访问者对象中。

      缺点:很难增加新的数据结构。

      资料来源:程杰老师<大话设计模式>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值