首页 > 代码库 > 【设计模式】—— 访问者模式Visitor

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

 

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