访问者模式

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

该模式结构如下:
[img]http://dl.iteye.com/upload/attachment/556439/25d2da7a-14e4-3234-b0d8-a59b1cf8be1f.jpg[/img]

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);
}
}
输出结果:
干掉日本男人:东条英机
搞定日本女人:酒井法子

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值