博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
访问者模式
阅读量:4181 次
发布时间:2019-05-26

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

访问者模式(visitor pattern):封装一些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

通俗的定义:在每个自定义对象中预定义一个Accept(请求访问)方法,这个方法会以对象为参数,调用Visitor(访问者)对象的visit方法来操作这个对象。

类图及定义

在这里插入图片描述

抽象访问者(visitor):声明一个或多个访问操作,形成所有元素都要是实现的接口。
具体访问者(concrete visitor):实现抽象访问者所声明的接口。
抽象节点(element):声明一个接受操作,接受一个访问者对象作为参数。
具体节点(concrete element):实现了抽象元素所规定的的接受操作。
结构对象(object structure):遍历结构中的所有对象,类似set、list等。

访问者模式的缺点
  1. 破坏了封装(就是clean code中的A.getB().getC())
  2. 增加节点困难(其实很多设计师反对使用)。
//抽象访问者public abstract class Visitor {
public abstract void visitConcreteElementA(ConcreteElementA concreteElementA); public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);}//具体访问者1public class ConcreteVisitor1 extends Visitor {
@Override public void visitConcreteElementA(ConcreteElementA concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName() + "被" + this.getClass().getSimpleName() + "访问"); } @Override public void visitConcreteElementB(ConcreteElementB concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName() + "被" + this.getClass().getSimpleName() + "访问"); }}//具体访问者2public class ConcreteVisitor2 extends Visitor {
@Override public void visitConcreteElementA(ConcreteElementA concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName() + "被" + this.getClass().getSimpleName() + "访问"); } @Override public void visitConcreteElementB(ConcreteElementB concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName() + "被" + this.getClass().getSimpleName() + "访问"); }}//抽象节点 public abstract class Element {
public abstract void accept(Visitor visitor);}//具体节点。每个自定义对象中预定义一个Accept(请求访问)方法,这个方法会以对象为参数,//调用Visitor(访问者)对象的visit方法来操作这个对象。public class ConcreteElementA extends Element {
@Override public void accept(Visitor visitor) {
visitor.visitConcreteElementA(this); }}public class ConcreteElementB extends Element {
@Override public void accept(Visitor visitor) {
visitor.visitConcreteElementB(this); }}public class VisitorClient {
public static void main(String[] args) {
ObjectStructure o = new ObjectStructure(); o.attach(new ConcreteElementA()); o.attach(new ConcreteElementB()); ConcreteVisitor1 visitor1 = new ConcreteVisitor1(); ConcreteVisitor2 visitor2 = new ConcreteVisitor2(); o.accept(visitor1); o.accept(visitor2); }}

转载地址:http://cmrai.baihongyu.com/

你可能感兴趣的文章
levelDB源码分析-Arena
查看>>
levelDB源码分析-SSTable
查看>>
平滑升级Nginx的Shell脚本
查看>>
SSH远程会话管理工具
查看>>
canvas标签设长宽是在css中还是在标签中
查看>>
如何创建一个vue项目
查看>>
webpack和webpack-simple中如何引入css文件
查看>>
vue1.0和vue2.0的区别之路由
查看>>
关于vue-router2.0的学习笔记
查看>>
vue1.0与2.0区别之生命周期
查看>>
vue2.0之非父子组件通信
查看>>
如何建立svn版本库并运行它
查看>>
如何合并svn分支到主干上
查看>>
libusb源码学习:list_entry
查看>>
libusb源码学习:几个函数加载的宏(windows)
查看>>
MCU_如何通过硬件VID 查找生产厂家
查看>>
NCNN部署例程 mxnet-gluoncv之simple_pose
查看>>
Ubuntu18.04查看显卡信息并安装NVDIA显卡驱动driver + Cuda + Cudnn
查看>>
电子元件二极管封装SMA,SMB,SMC的区别
查看>>
利用FFmpeg玩转Android视频录制与压缩(二)
查看>>