【设计模式】—— 访问者模式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,如需转载请自行联系原博主。
相关文章
|
4月前
|
设计模式 XML JSON
【设计模式】【行为型模式】访问者模式(Visitor)
一、入门 什么是访问者模式? 访问者模式(Visitor Pattern)是一种行为设计模式,允许你将算法与对象结构分离。通过这种方式,可以在不改变对象结构的情况下,向对象结构中的元素添加新的操作。
131 10
|
7月前
|
设计模式 算法 Java
【再谈设计模式】访问者模式~操作对象结构的新视角
  访问者模式是一种行为设计模式,旨在解决对象结构与操作逻辑的耦合问题。在软件系统开发中,当面临复杂的对象结构(如多种类型对象组成的树形或图形结构),且需要对这些对象执行不同操作时,传统方式将操作直接写在对象类中会导致类职责过多,不利于维护和扩展。而访问者模式通过将操作与对象结构分离,允许在不改变现有对象结构的情况下定义新操作,元素接受访问者访问,访问者定义对不同类型元素的操作逻辑,从而为应对这种复杂情况提供了有效的解决方案。
98 0
|
设计模式 算法 Java
【设计模式】JAVA Design Patterns——Acyclic Visitor(非循环访问者模式)
【设计模式】JAVA Design Patterns——Acyclic Visitor(非循环访问者模式)
|
11月前
|
设计模式 JavaScript 前端开发
JavaScript设计模式--访问者模式
【10月更文挑战第1天】
97 3
|
12月前
|
设计模式 缓存 算法
Java设计模式-访问者模式(22)
Java设计模式-访问者模式(22)
175 0
|
设计模式 安全 Java
【设计模式】字节三面:请举例阐释访问者模式
【设计模式】字节三面:请举例阐释访问者模式
98 2
|
设计模式 Go
[设计模式 Go实现] 行为型~访问者模式
[设计模式 Go实现] 行为型~访问者模式
|
设计模式 算法 编译器
【设计模式系列笔记】访问者模式
访问者模式是一种行为设计模式,旨在将算法与对象结构分离,使得能够在不修改元素类的前提下定义新的操作。这一模式的核心思想是在元素类中添加一个接受访问者的方法,从而实现在不同元素上执行不同操作的能力。
129 0
|
设计模式 算法 Java
小谈设计模式(29)—访问者模式
小谈设计模式(29)—访问者模式
|
4月前
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
113 16