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

简介:

  前言:【模式总览】——————————by xingoo

  模式意图

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

  应用场景

  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
复制代码

 

本文转自博客园xingoo的博客,原文链接:【设计模式】—— 访问者模式Visitor,如需转载请自行联系原博主。
相关文章
|
5月前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
60 1
|
8天前
|
设计模式 缓存 算法
Java设计模式-访问者模式(22)
Java设计模式-访问者模式(22)
|
5月前
|
设计模式 算法 Java
【设计模式】JAVA Design Patterns——Acyclic Visitor(非循环访问者模式)
【设计模式】JAVA Design Patterns——Acyclic Visitor(非循环访问者模式)
|
5月前
|
设计模式 安全 Java
【设计模式】字节三面:请举例阐释访问者模式
【设计模式】字节三面:请举例阐释访问者模式
34 2
|
5月前
|
设计模式 算法 Java
23种设计模式,访问者模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】访问者模式是一种将算法与对象结构分离的设计模式。这种模式主要用于执行一个操作(或一组操作)在一个对象结构的各元素上,它可以在不修改各元素的类的前提下定义新的操作。
44 2
|
5月前
|
设计模式 Go
[设计模式 Go实现] 行为型~访问者模式
[设计模式 Go实现] 行为型~访问者模式
|
5月前
|
设计模式 算法 编译器
【设计模式系列笔记】访问者模式
访问者模式是一种行为设计模式,旨在将算法与对象结构分离,使得能够在不修改元素类的前提下定义新的操作。这一模式的核心思想是在元素类中添加一个接受访问者的方法,从而实现在不同元素上执行不同操作的能力。
55 0
|
5月前
|
设计模式 算法 Java
小谈设计模式(29)—访问者模式
小谈设计模式(29)—访问者模式
|
5月前
|
设计模式 算法 Java
【设计模式】访问者模式
【设计模式】访问者模式
|
5月前
|
设计模式 Java 容器
聊聊Java设计模式-访问者模式
访问者模式(Visitor Pattern)指将作用域某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作。
49 3
聊聊Java设计模式-访问者模式