前言:【】——————————by xingoo
模式意图
对于某个对象或者一组对象,不同的访问者,产生的结果不同,执行操作也不同。此时,就是访问者模式的典型应用了。
应用场景
1 不同的子类,依赖于不同的其他对象
2 需要对一组对象,进行许多不相关的操作,又不想在类中是现在这些方法
3 定义的类很少改变,但是执行的操作却经常发生改变。
模式结构
Context 环境角色
class Context{ Listlist = 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 Listlist = 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