博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式】—— 访问者模式Visitor
阅读量:5902 次
发布时间:2019-06-19

本文共 3390 字,大约阅读时间需要 11 分钟。

  前言:【】——————————by xingoo

  模式意图

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

  应用场景

  1 不同的子类,依赖于不同的其他对象

  2 需要对一组对象,进行许多不相关的操作,又不想在类中是现在这些方法

  3 定义的类很少改变,但是执行的操作却经常发生改变。

  模式结构

  Context 环境角色

class Context{    List
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
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的博客,原文链接:,如需转载请自行联系原博主。
你可能感兴趣的文章
Springboot配置(上)
查看>>
java--Eclipse for mac 代码提示(代码助手,代码联想)快捷键修改
查看>>
Jdom的简单操作
查看>>
left join on/right join on/inner join on/full join on连接
查看>>
Codeforces 582B Once Again
查看>>
template.helper 多参数
查看>>
RadioButton布局图片+文字 实现tabhost效果
查看>>
access中设置不等于
查看>>
hdu 1221 Rectangle and Circle
查看>>
Android 四大组件之四(ContentProvider)
查看>>
Android 四大组件之一(Activity)
查看>>
扫描(一)
查看>>
PIE SDK矢量数据的读取
查看>>
两种方式分别改变alertdialog的宽和高
查看>>
TextView-setCompondDrawables用法
查看>>
Centos7安装rabbitmq server 3.6.0
查看>>
iostat命令学习
查看>>
SQL 三种分页方式
查看>>
查看linux是ubuntu还是centos
查看>>
html video的url更新,自动清缓存
查看>>