java设计模式_访问者模式
java设计模式_访问者模式
王大叔爱编程 发表于5年前
java设计模式_访问者模式
  • 发表于 5年前
  • 阅读 85
  • 收藏 2
  • 点赞 0
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   


1) 访问者角色(Visitor):为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。

  2) 具体访问者角色(Concrete Visitor):实现每个由访问者角色(Visitor)声明的操作。

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

  4) 具体元素角色(Concrete Element):实现由元素角色提供的Accept操作。

  5) 对象结构角色(Object Structure):这是使用访问者模式必备的角色。它要具备以下特征:能枚举它的元素;可以提供一个高层的接口以允许该访问者访问它的元素;可以是一个复合(组合模式)或是一个集合,如一个列表或一个无序集合。

    访问者模式结构图如下:


package com.wangbiao.test;

public interface Visitor {

	public void visit(Element_One e);
	public void visit(Element_Two e);
}

package com.wangbiao.test;

public class Visitor_Two implements Visitor {


	@Override
	public void visit(Element_One e) {
		System.out.println("Visitor_Two 访问Element_One");
	}

	
	@Override
	public void visit(Element_Two e) {
		System.out.println("Visitor_Two 访问Element_Two");
	}

}

package com.wangbiao.test;

public class Visitor_One implements Visitor{


	@Override
	public void visit(Element_One e) {
		System.out.println("Visitor_One 访问Element_One");
	}

	@Override
	public void visit(Element_Two e) {
		System.out.println("Visitor_One 访问Element_Two");
	}

}

package com.wangbiao.test;

public interface Element {

	public void accept(Visitor visitor);
}

package com.wangbiao.test;

public class Element_Two implements Element{

	@Override
	public void accept(Visitor visitor) {
		visitor.visit(this);
	}

}

package com.wangbiao.test;

public class Element_One implements Element{

	@Override
	public void accept(Visitor visitor) {
		visitor.visit(this);
	}

}

package com.wangbiao.test;

import java.util.ArrayList;
import java.util.List;

public class Test {

	public static void main(String[] args) {
		Visitor visitor=new Visitor_Two();
		ObjectStructure os=new ObjectStructure();
		os.addElement(new Element_One());
		os.addElement(new Element_Two());
		os.accept(visitor);
	
		
	}
}
//对象结构角色(Object Structure):这是使用访问者模式必备的角色。
//它要具备以下特征:能枚举它的元素;可以提供一个高层的接口以允许该访问者访问它的元素;
//可以是一个复合(组合模式)或是一个集合,如一个列表或一个无序集合。
class ObjectStructure{
	private List<Element> list=new ArrayList<Element>();
	
	public void accept(Visitor visitor){
		for (Element e : list){
			e.accept(visitor);
		}
	}
	
	public void addElement(Element e){
		list.add(e);
	}
	public void deleteElement(Element e){
		list.remove(e);
	}
}

典型运用:

在dom4j的VisitorSupport上面就有Visitor的运用。

优缺点:

先来看下访问者模式的使用能否避免引言中的痛苦。使用了访问者模式以后,对于原来的类层次增加新的操作,仅仅需要实现一个具体访问者角色就可以了,而不必 修改整个类层次。而且这样符合“开闭原则”的要求。而且每个具体的访问者角色都对应于一个相关操作,因此如果一个操作的需求有变,那么仅仅修改一个具体访 问者角色,而不用改动整个类层次。

  看来访问者模式确实能够解决我们面临的一些问题。

  而且由于访问者模式为我们的系统多提供了一层“访问者”,因此我们可以在访问者中添加一些对元素角色的额外操作。

  但是“开闭原则”的遵循总是片面的。如果系统中的类层次发生了变化,会对访问者模式产生什么样的影响呢?你必须修改访问者角色和每一个具体访问者角色……

 看来访问者角色不适合具体元素角色经常发生变化的情况。而且访问者角色要执行与元素角色相关的操作,就必须让元素角色将自己内部属性暴露出来,而在 java中就意味着其它的对象也可以访问。这就破坏了元素角色的封装性。而且在访问者模式中,元素与访问者之间能够传递的信息有限,这往往也会限制访问者 模式的使用。

标签: java Visitor
共有 人打赏支持
王大叔爱编程
粉丝 31
博文 104
码字总数 63525
×
王大叔爱编程
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: