【设计模式】—— 访问者模式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 }
View Code

 

  运行结果

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

 

转载于:https://www.cnblogs.com/xing901022/p/4085008.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值