`
makeyouown
  • 浏览: 50622 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

访问者模式

    博客分类:
  • J2EE
 
阅读更多
GoF对访问者模式定义为:表示一个作用于某对象结构中各元素的操作。它可以使你不修改各元素类的前提下定义作用于这些元素的新操作,也就是动态的增加新的方法。
Visitor模式是一种分离对象数据结构与行为的方法,通过这种分离,可以为一个已存在的类或类群增加新的操作而无需为它们作任何修改。
Visitor模式的优点:
- 分离对象的数据结构与行为,让不同的类完成不同的功能
- 可以不修改已有类的基础上增加新的操作行为
- 从另一个角度来看,同一个数据结构,为其实现不同的观察者,便可呈现不同的行为

该模式结构如下:


Visitor模式的实现步骤:
1,定义具有继承关系的数据结构对象群(相当于Element与ConcreteElement角色),并定义accept(Visitor)方法接受Visitor访问
2,定义包含上述数据结构对象群的复合结构对象(相当于ObjectStructure角色)
3,定义Visitor抽象接口,定义所有访问行为方法(相当于Visitor角色)
4,定义具体的访问者对象,并实现所有visit方法(相当于ConcreteVisitor角色)

举个例子:
日本有日本男人和日本女人,分别定义不同的访问者。
代码实现如下:
public interface Japanese {

	public void accept(Visitor visitor);
	
	public String getName();
	
}
public class MaleJapan implements Japanese{

	private String name = null;
	
	public MaleJapan(String name){
		this.name = name;
	}
	
	public void accept(Visitor visitor){
    	visitor.visitorMale(this);
	}
	
	public String getName(){
    	return name;
    }
}
public class FemaleJapan implements Japanese {
    private String name =  null;
	
    public FemaleJapan(String name){
    	this.name = name;
    }
    public void accept(Visitor visitor){
    	visitor.visitorFemale(this);
	}
    public String getName(){
    	return name;
    }
}
public interface Visitor {

	public void visitorMale(MaleJapan male);
	
	public void visitorFemale(FemaleJapan female);
		
}
public class MaleVisitor implements Visitor {

	public void visitorFemale(FemaleJapan female) {
		// TODO
	}

	public void visitorMale(MaleJapan male) {
		System.out.println("干掉日本男人:"+male.getName());
	}

}
public class FemaleVisitor implements Visitor {

	public void visitorFemale(FemaleJapan female) {
		System.out.println("搞定日本女人:"+female.getName());
	}

	public void visitorMale(MaleJapan male) {
		// TODO
	}

}
public class Country {

	List<Japanese> people = new ArrayList<Japanese>();

	public void addPeople(Japanese japan){
		people.add(japan);
	}
	
	public void removePeople(Japanese japan){
		people.remove(japan);
	}
	
	public void accept(Visitor visitor){
		for(Japanese japan : people){
			japan.accept(visitor);
		}
	}
}
public class Main {

	/**
	 * [方法功能说明]
	 * @param args
	 */
	public static void main(String[] args) {
		Visitor v1 = new MaleVisitor();
		Visitor v2 = new FemaleVisitor();
	
		Country c = new Country();
		c.addPeople(new MaleJapan("东条英机"));
		c.addPeople(new FemaleJapan("酒井法子"));
		
		c.accept(v1);
		c.accept(v2);
	}
}
输出结果:
干掉日本男人:东条英机
搞定日本女人:酒井法子



  • 大小: 32.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics