专栏首页xingoo, 一个梦想做发明家的程序员【设计模式】—— 访问者模式Visitor

【设计模式】—— 访问者模式Visitor

  模式意图

  对于某个对象或者一组对象,不同的访问者,产生的结果不同,执行操作也不同。此时,就是访问者模式的典型应用了。

  应用场景

  1 不同的子类,依赖于不同的其他对象

  2 需要对一组对象,进行许多不相关的操作,又不想在类中是现在这些方法

  3 定义的类很少改变,但是执行的操作却经常发生改变。

  模式结构

  Context 环境角色

class Context{
    List<Node> list = new ArrayList();
    public void add(Node node) {
        list.add(node);
    }
    public void visit(Visitor visitor) {
        for(Node node : list){
            node.accept(visitor);
        }
    }
}

  Visitor 访问者角色

interface Visitor{
    public void visit(NodeA nodeA);
    public void visit(NodeB nodeB);
}
class VisitA implements Visitor{
    public void visit(NodeA nodeA){
        System.out.println("***visitA***");
        nodeA.action();
    }
    public void visit(NodeB nodeB){
        System.out.println("***visitA***");
        nodeB.action();
    }
}
class VisitB implements Visitor{
    public void visit(NodeA nodeA){
        System.out.println("***visitB***");
        nodeA.action();
    }
    public void visit(NodeB nodeB){
        System.out.println("***visitB***");
        nodeB.action();
    }
}

  Node 被访问角色

interface Node{
    public void accept(Visitor visitor);
}
class NodeA implements Node{
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
    public void action(){
        System.out.println("NodeA visited");
    }
}
class NodeB implements Node{
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
    public void action(){
        System.out.println("NodeB visited");
    }
}

  全部代码

 1 package com.xingoo.test.design.visitor;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 interface Visitor{
 7     public void visit(NodeA nodeA);
 8     public void visit(NodeB nodeB);
 9 }
10 class VisitA implements Visitor{
11     public void visit(NodeA nodeA){
12         System.out.println("***visitA***");
13         nodeA.action();
14     }
15     public void visit(NodeB nodeB){
16         System.out.println("***visitA***");
17         nodeB.action();
18     }
19 }
20 class VisitB implements Visitor{
21     public void visit(NodeA nodeA){
22         System.out.println("***visitB***");
23         nodeA.action();
24     }
25     public void visit(NodeB nodeB){
26         System.out.println("***visitB***");
27         nodeB.action();
28     }
29 }
30 interface Node{
31     public void accept(Visitor visitor);
32 }
33 class NodeA implements Node{
34     public void accept(Visitor visitor) {
35         visitor.visit(this);
36     }
37     public void action(){
38         System.out.println("NodeA visited");
39     }
40 }
41 class NodeB implements Node{
42     public void accept(Visitor visitor) {
43         visitor.visit(this);
44     }
45     public void action(){
46         System.out.println("NodeB visited");
47     }
48 }
49 class Context{
50     List<Node> list = new ArrayList();
51     public void add(Node node) {
52         list.add(node);
53     }
54     public void visit(Visitor visitor) {
55         for(Node node : list){
56             node.accept(visitor);
57         }
58     }
59 }
60 public class Client {
61     private static Context ctx = new Context();
62     public static void main(String[] args) {
63         ctx.add(new NodeA());
64         ctx.add(new NodeB());
65         ctx.visit(new VisitA());
66         ctx.visit(new VisitB());
67     }
68 }

  运行结果

***visitA***
NodeA visited
***visitA***
NodeB visited
***visitB***
NodeA visited
***visitB***
NodeB visited

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Web监听器导图详解

      监听器是JAVA Web开发中很重要的内容,其中涉及到的知识,可以参考下面导图: ? Web监听器   1 什么是web监听器?   web监听器是一种Se...

    用户1154259
  • 【设计模式】—— 创建者模式Builder

      模式意图   一个对象的创建十分复杂,为了区分构建过程和使用过程,因此分开。使用一个Director类进行对象的创建,Builder规定了这个创建过程。 ...

    用户1154259
  • 【设计模式】—— 中介者模式Mediator

      模式意图   使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合。   这个中介者常常起着中间桥梁的作用,使其他的对象可以利用中介...

    用户1154259
  • 设计模式(二十四) 访问者模式

    访问者模式提供了一种方法,将算法和数据结构分离。假设我们需要对一个数据结构进行不同的操作,就可以考虑使用访问者模式。访问者模式的要点在于,需要一个访问者接口,提...

    乐百川
  • 用最简单的例子说明设计模式(三)之责任链、建造者、适配器、代理模式、享元模式

    六月的雨
  • Android 之游戏开发流程

    一、概述 刚开始接触Android平台,之前也没有游戏开发经验,因此对于如何开发一款游戏没有思路,而且也不知道如何对整个项目进行模块划分。在学习连连看的教程时,...

    一灰灰blog
  • 经典设计模式(一):策略模式

    写出可维护、可复用、可扩展及灵活的代码是我们的目的,也是学习设计模式的理由,这句话是他娘的复制的,为什么要学设计模式,设计模式是什么,还是去百度一下吧,我就不装...

    低调小熊猫
  • Android组件化-经典MVP

    Android MVP是安卓开发中一个经典的话题,当项目较大、参与的开发人员较多,MVP的优势就体现出来了。

    用户2987604
  • Spring中基于注解@AspectJ的AOP实现

    @AspectJ 作为通过 Java 5 注释注释的普通的 Java 类,它指的是声明aspects 的一种风格。通过在基于架构的 XML 配置文件中包含以下元...

    Jerry Wang
  • Java-匿名子类(匿名内部类)

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

    Fisherman渔夫

扫码关注云+社区

领取腾讯云代金券