JAVA 设计模式 访问者模式

用途

访问者模式 (Visitor)

表示一个作用于某对象结构中的各元素的操作。 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

访问者模式是一种行为型模式

用途

图-访问者模式结构图

Visitor : 为该对象结构中 ConcreteElement 的每一个类声明一个 Visit 操作。

abstract class Visitor {
 public abstract void VisitConcreteElementA(ConcreteElementA elementA);
 public abstract void VisitConcreteElementB(ConcreteElementB elementB);
 }

ConcreteVisitor : 实现每个由 Visitor 声明的操作。每个操作实现算法的一部分,而该算法片段乃是对应于结构中对象的类。

class ConcreteVisitor1 extends Visitor {
     @Override
 public void VisitConcreteElementA(ConcreteElementA elementA) {
         System.out.println(this.getClass().getName() + " 访问 " + elementA.getClass().getName());
     }
 
     @Override
 public void VisitConcreteElementB(ConcreteElementB elementB) {
         System.out.println(this.getClass().getName() + " 访问 " + elementB.getClass().getName());
     }
 }
 
 class ConcreteVisitor2 extends Visitor {
     @Override
 public void VisitConcreteElementA(ConcreteElementA elementA) {
         System.out.println(this.getClass().getName() + " 访问 " + elementA.getClass().getName());
     }
 
     @Override
 public void VisitConcreteElementB(ConcreteElementB elementB) {
         System.out.println(this.getClass().getName() + " 访问 " + elementB.getClass().getName());
     }
 }

Element : 定义一个Accpet操作,它以一个访问者为参数。

abstract class Element {
 public abstract void Accept(Visitor visitor);
 }

ConcreteElement : 实现 Element 声明的 Accept 操作。

class ConcreteElementA extends Element {
     @Override
 public void Accept(Visitor visitor) {
         visitor.VisitConcreteElementA(this);
     }
 }
 
 class ConcreteElementB extends Element {
     @Override
 public void Accept(Visitor visitor) {
         visitor.VisitConcreteElementB(this);
     }
 }

ObjectStructure : 可以枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。

class ObjectStructure {
 private List<Element> elements = new ArrayList<Element>();
 
 public void Attach(Element element) {
         elements.add(element);
     }
 
 public void Detach(Element element) {
         elements.remove(element);
     }
 
 public void Accept(Visitor visitor) {
 for (Element elem : elements) {
             elem.Accept(visitor);
         }
     }
 }

测试代码

public class VisitorPattern {
 public static void main(String[] args) {
         ObjectStructure o = new ObjectStructure();
         o.Attach(new ConcreteElementA());
         o.Attach(new ConcreteElementB());
 
         ConcreteVisitor1 v1 = new ConcreteVisitor1();
         ConcreteVisitor2 v2 = new ConcreteVisitor2();
 
         o.Accept(v1);
         o.Accept(v2);
     }
 }

运行结果

 ConcreteVisitor1 访问 ConcreteElementA
 ConcreteVisitor1 访问 ConcreteElementB
 ConcreteVisitor2 访问 ConcreteElementA
 ConcreteVisitor2 访问 ConcreteElementB

推荐

本文属于 JAVA设计模式系列

参考资料

《大话设计模式》《HeadFirst设计模式》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏lgp20151222

Spring AOP的增强处理

就是@Before @Around @AfterReturning @AfterThrowing这几个标签的属性可以放到方法参数里面获取

691
来自专栏码匠的流水账

聊聊eureka server的response cache

eureka-core-1.8.8-sources.jar!/com/netflix/eureka/resources/ApplicationResource....

663
来自专栏10km的专栏

fastjson:实现对java.nio.ByteBuffer数据类型的支持

一般情况下,我们都用byte[]作为保存二进制数据的数据类型,较少用ByteBuffer来表示字节数组。然而最近的工作中需要二进制数据(字节数组)即支持fast...

2318
来自专栏JAVA技术站

JAVA流之ObjectOutputStream,ObjectInputStream

894
来自专栏菩提树下的杨过

java 利用JAX-RS快速开发RESTful 服务

JAX-RS(Java API for RESTful Web Services)同样也是JSR的一部分,详细规范定义见 https://jcp.org/en/...

2077
来自专栏wannshan(javaer,RPC)

dubbo序列化过程源码分析

先看下dubbo在serialize层的类设计方案 序列化方案的入口,是接口Serialization的实现类。 /** * Serialization. ...

5169
来自专栏码匠的流水账

聊聊spring cloud gateway的RetryGatewayFilter

本文主要研究一下spring cloud gateway的RetryGatewayFilter

822
来自专栏恰同学骚年

设计模式的征途—23.解释器(Interpreter)模式

虽然目前计算机编程语言有好几百种,但有时人们还是希望用一些简单的语言来实现特定的操作,只需要向计算机输入一个句子或文件,就能按照预定的文法规则来对句子或文件进行...

742
来自专栏菩提树下的杨过

深度解析 TypeConverter & TypeConverterAttribute (一)

前言     我们在开发复杂控件的时候不可避免的碰到类型转换TypeConverter,微软给我们提供了很多转换类如ArrayConverter,BaseNu...

1986
来自专栏飞扬的花生

C# XML操作

1.XML帮助类 using System; using System.Collections.Generic; using System.Text; usin...

2097

扫码关注云+社区