`
hulianwang2014
  • 浏览: 681133 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

访问者模式(Visitor Pattern)

 
阅读更多

在访问者模式中,我们使用一个能够改变一个元素类执行算法的类。通过这种方法,元素的执行算法随着访问者的不同而不同。这种模式归属于行为型模式范畴。每个这样的模式,元素对象不得不接受访问者对象,以便于访问者对象能够处理在这个元素上的操作。

为了更好的阐述这个观念,我用一个实例来表达这个思想。

我创建了一个接口ComputePart,这个接口能接受Keyboard,Mouse,Monitor 和Compute作为具体的实现类。另外,我定义了另一个接口ComputePartVisitor,它的实现类ComputePartDisplayVisitor实现了所有的操作。UML类图如下所示:


定义一个接口来呈现元素,接口 ComputePart。

public interface class ComputerPart {
   public void accept(ComputerPartVisitor computerPartVisitor);
}


定义一些列的实现类来实现上面的接口。

Keyboard.java

public class Keyboard  implements ComputerPart {
 
   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}


Monitor.java

public class Monitor  implements ComputerPart {
 
   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}


Mouse.java

public class Mouse  implements ComputerPart {
 
   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}


Computer.java

public class Computer implements ComputerPart {
          
   ComputerPart[] parts;
 
   public Computer(){
      parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};              
   } 
 
 
   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      for (int i = 0; i < parts.length; i++) {
         parts[i].accept(computerPartVisitor);
      }
      computerPartVisitor.visit(this);
   }
}


定义另一个接口,便于呈现访问者(visitor)操作的实现。

ComputerPartVisitor.java

public interface ComputerPartVisitor {
          public void visit(Computer computer);
          public void visit(Mouse mouse);
          public void visit(Keyboard keyboard);
          public void visit(Monitor monitor);
}


具体的访问者实现类,实现上述的接口。

ComputerPartDisplayVisitor.java

public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
 
   @Override
   public void visit(Computer computer) {
      System.out.println("Displaying Computer.");
   }
 
   @Override
   public void visit(Mouse mouse) {
      System.out.println("Displaying Mouse.");
   }
 
   @Override
   public void visit(Keyboard keyboard) {
      System.out.println("Displaying Keyboard.");
   }
 
   @Override
   public void visit(Monitor monitor) {
      System.out.println("Displaying Monitor.");
   }
}


最后,定义一个测试类,测试上述的功能。

VisitorPatternDemo.java

public class VisitorPatternDemo {
   public static void main(String[] args) {
 
      ComputerPart computer = new Computer();
      computer.accept(new ComputerPartDisplayVisitor());
   }
}


从上面的实例中可以知道,我们可以定义其它的访问者实现类来实现不同的功能,根据访问者的不同,调用的算法也随着不同。

分享到:
评论

相关推荐

    访问者模式VisitorPattern

    访问者模式(Java代码实现),博文附件

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    1、策略模式STRATEGY PATTERN 2、代理模式PROXY PATTERN 3、单例模式SINGLETON PATTERN ...18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21、中介者模式 22、解释器模式 23、亨元模式 24、备忘录模式

    设计模式之访问者模式(Visitor Pattern)

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

    访问者模式(VisitorPattern)

    访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。System.Collection命名空间下提供了大量集合操作对象。但大多数情况下处理的都是...

    C#版 24种设计模式

    策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单例模式(Singleton Pattern) 迭代器模式(Iterator Pattern) 访问者模式(Visitor Pattern) 工厂方法模式(Factory ...

    用Java实现23种设计模式

    访问者模式(Visitor Pattern) 4. J2EE 模式 MVC 模式(MVC Pattern) 业务代表模式(Business Delegate Pattern) 数据访问对象模式(Dao Pattern) 前端控制器模式(Front Controller Pattern) 拦截过滤器...

    C#设计模式_设计模式_C#_

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5.... 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    C#设计模式(23种设计模式)

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory... 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern) @Author kwming

    Java设计模式,并加上个人理解

    1. 设计模式 ...13. 访问者模式 (Visitor Pattern) 14. 迭代器模式 (Iterator Pattern) 15. 享元模式 (Flyweight Pattern) 16. 桥接模式 (Bridge Pattern) 17. 观察者模式 (Observer Pattern)

    设计模式PPT

    创建型模式用来处理对象的创建过程,主要包含以下5种设计模式:  工厂方法模式(Factory Method Pattern)  抽象工厂模式(Abstract Factory Pattern)  建造者模式(Builder... 访问者模式(Visitor Pattern)

    33种JAVA设计模式DEMO

    访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。 MVC 模式(MVC Pattern) 业务代表模式(Business Delegate Pattern) 组合实体模式(Composite ...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下使用。 创建型: ...访问者模式(Visitor)

    设计模式代码——c#

    C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式...22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    23种设计模式 (创建型,结构型,行为型)

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) ... 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    Reflect on the Visitor design pattern

    Reflect on the Visitor design pattern 访问者模式非常不错的讲解,很细致。

    32种设计模式

    C# 32种设计模式: 创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) ... 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    访问者模式

    在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受...

    design-pattern-java.pdf

    算法的封装与切换——策略模式(四) 模板方法模式-Template Method Pattern 模板方法模式深度解析(一) 模板方法模式深度解析(二) 模板方法模式深度解析(三) 访问者模式-Visitor Pattern 操作复杂对象结构——...

Global site tag (gtag.js) - Google Analytics