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
分享到:
相关推荐
设计模式C++学习之访问者模式(Visitor)
访问者模式Demo
设计模式 - 访问者模式
68丨访问者模式(上):手把手带你还原访问者模式诞生的思维过程1
最简单的访问者模式讲解代码,设计模式可看看博客中简介http://blog.sina.com.cn/s/blog_161d504630102wxis.html
建造者模式组合模式访问者模式 abstract class Bulider{ public abstract void BuildPartA() ; public abstract void BuildPartB() ; public abstract Product GetResult() ; }
访问者模式的小例子
访问者模式代码
访问者模式的第二个例子
java设计模式之访问者模式,通过实际例子说明访问者模式原理和适用场景;
访问者模式,你绝对会用到的模式,值得学习,通俗易懂的实例,原理和运用都说明白了。
设计模式之访问者模式Java版本的实现和UML类图
设计模式的访问者模式的例子,希望对大家有用~~~~~~~~
C#面向对象设计模式 (行为型模式) Visitor 访问者模式 视频讲座下载
设计模式-访问者模式(讲解及其实现代码)
ios 平台实现设计模式-访问者模式,以最简单的代码实现访问者模式讲解,主旨在于了解访问者模式,博客:http://blog.sina.com.cn/s/blog_161d504630102wwxe.html
访问者模式(Visitor) 用意:适用于数据结构相对未定的系统,把数据结构和作用于结构上的操作间的耦合解开。
访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。