Java设计模式之行为型-访问者模式(UML类图+案例分析)

这篇具有很好参考价值的文章主要介绍了Java设计模式之行为型-访问者模式(UML类图+案例分析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、基础概念

二、UML类图

三、角色设计

四、案例分析

五、总结


一、基础概念

访问者模式是一种对象行为型设计模式,它能够在不修改已有对象结构的前提下,为对象结构中的每个对象提供新的操作。

访问者模式的主要作用是把对元素对象的操作抽象出来封装到访问者类中,这样就可以对存在不同操作的元素对象进行统一的处理。

二、UML类图

Java设计模式之行为型-访问者模式(UML类图+案例分析),Java,设计模式,java,设计模式,访问者模式

三、角色设计

角色 描述
抽象访问者角色 定义访问元素对象的操作,每个操作对应一个方法
具体访问者角色 实现访问者接口,给出对每个元素类型访问的具体实现
抽象元素角色 定义一个含有接受操作方法accept()的接口,accept()方法以一个访问者对象为参数
具体元素角色 实现抽象元素接口,每个具体元素都要实现accept()方法,在accept()方法中调用访问者对象的对应方法
对象结构角色 可以枚举它的元素,可以提供高层的接口以允许访问者访问它的元素

四、案例分析

下面通过一段代码演示如何使用访问者模式来对不同类型的资源文件(Image、Video、Document)进行压缩操作。

客户端可以为ResourceFileStructure添加不同的资源文件,然后传入一个Compressor访问者对象,就可以通过统一的访问接口对不同资源文件进行压缩操作,而不需要修改资源文件类的代码。

定义Compressor接口(抽象访问者角色),声明了压缩每一种资源文件的方法 :

public interface Compressor {

    void compress(Image image);
    void compress(Video video);
    void compress(Document document);

}

ZipCompressor类(具体访问者角色),实现了压缩每一种资源文件的具体操作:

public class ZipCompressor implements Compressor {

    @Override
    public void compress(Image image) {
        System.out.println("压缩了图片:"+image.getName());
    }

    @Override
    public void compress(Video video) {
        System.out.println("压缩了视频:"+video.getName());
    }

    @Override
    public void compress(Document document) {
        System.out.println("压缩了文档:"+document.getName());
    }

}

 ResourceFile接口(抽象元素角色),声明了接受访问者的accept方法:

public interface ResourceFile {

  void accept(Compressor compressor);

}

Image、Video、Document类(具体元素角色),提供了资源文件信息,并在accept方法中调用访问者的对应方法:

public class Image implements ResourceFile {

  private String name;
  public Image(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  @Override
  public void accept(Compressor compressor) {
    compressor.compress(this);
  }

}

public class Video implements ResourceFile {

  private String name;
  public Video(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  @Override
  public void accept(Compressor compressor) {
    compressor.compress(this);
  }

}

public class Document implements ResourceFile {

  private String name;
  public Document(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  @Override
  public void accept(Compressor compressor) {
    compressor.compress(this);
  }

}

ResourceFileStructure类(对象结构角色)管理所有元素,并可以遍历元素使其接受访问者访问:

import java.util.ArrayList;
import java.util.List;

public class ResourceFileStructure {

  private List<ResourceFile> files = new ArrayList<>();

  public void addResource(ResourceFile file) {
    files.add(file);
  }

  public void handleVisiting(Compressor compressor) {
    for(ResourceFile file : files) {
      // 调用元素的accept方法
      file.accept(compressor);
    }
  }
}

客户端:

public class Client {

    public static void main(String[] args) {
        // 客户端代码
        ResourceFileStructure structure = new ResourceFileStructure();

        // 添加资源文件
        structure.addResource(new Image("a.png"));
        structure.addResource(new Video("b.mp4"));
        structure.addResource(new Document("c.doc"));

        Compressor compressor = new ZipCompressor();

        // 处理访问
        structure.handleVisiting(compressor);

        // 输出结果
        System.out.println("文件压缩完成");
    }
}

运行结果如下:

Java设计模式之行为型-访问者模式(UML类图+案例分析),Java,设计模式,java,设计模式,访问者模式

该案例的执行流程是:

1、创建资源文件对象(Image、Video、Document等)和资源文件结构ResourceFileStructure对象。

2、向ResourceFileStructure对象中添加资源文件对象。

3、创建具体访问者对象,例如ZipCompressor。

4、调用ResourceFileStructure的handleVisiting()方法,传入访问者对象。

5、在handleVisiting()方法中遍历内部存储的所有资源文件,并调用每个资源文件的accept()方法,以访问者对象作为参数。

6、在每个资源文件类的accept()方法中,调用访问者对象的参数对应的方法,例如调用compressor.compress(this)。

7、于是压缩程序类中的compress()方法就会被执行,从而实现对该资源文件的压缩操作。

8、这样就通过访问者对象使不同类型的资源文件进行了统一的压缩处理,而不需要修改资源文件类的代码。

9、如果需要新增一种压缩方式,只需要新增一个实现Compressor接口的类,不需要修改资源文件类。 

五、总结

优点:

1、增加新的操作很容易。访问者模式使得新增操作变得很容易。如果需要增加新的操作,只需要添加一个新的具体访问者类即可,无需作用于其他类的修改。

2、实现了数据结构与操作分离。访问者模式将数据结构与作用于结构上的操作分离开来,使得操作集合可相对自由地演化而不影响系统的数据结构。

3、符合单一职责原则。访问者模式把相关的行为封装到一个访问者对象中,使每个访问者的功能都比较单一。

4、扩展性良好。可以在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。

缺点:

1、具体元素对访问者公布细节。访问者模式中具体元素对访问者公布自己的细节,这打破了对象的封装性。

2、具体元素变更困难。如果一个对象结构中的具体元素发生变化,例如新增或者删除了元素,那么访问者都需要进行适当的修改。

3、违反了依赖倒置原则。访问者依赖了具体元素,而不是抽象元素。

4、破坏对象结构的封装。访问者模式中对象结构必须公布自身的内部细节,否则访问者无法访问对象内部的元素,这破坏了对象的封装性。

应用场景:

1、对象结构稳定,但其操作经常变化的系统。访问者模式可以隔离变化的部分。

2、需要对对象结构的对象执行很多不同和不相关的操作,可以将这些操作集中到访问者中,避免污染对象类。

3、希望新增操作时不改变对象结构,新增访问者可以实现此需求。

4、需要对不同对象结构执行共同操作,可以使用访问者模式重用操作。

5、对象结构中对象类型经常改变,访问者模式可以隔离这种变化对对象结构的影响。

6、在不改变对象类的情况下,为对象增加新功能。

7、将相关操作集中到访问者中,避免将操作分散到对象类中。

8、将变化点从稳定的对象结构中抽象出来,提高软件灵活性。

符合的设计原则:

1、单一职责原则(Single Responsibility Principle)

访问者模式通过将相关行为抽取到访问者类中,使每个访问者类都只负责一组特定的行为,这点符合单一职责原则。

访问者模式适用于数据结构相对稳定,但经常需要在此数据结构上定义新的操作的时候使用。如果数据结构经常变化,或者都操作不太发生变化,则不太适合使用访问者模式。文章来源地址https://www.toymoban.com/news/detail-565747.html

到了这里,关于Java设计模式之行为型-访问者模式(UML类图+案例分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【设计模式——学习笔记】23种设计模式——访问者模式Visitor(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    测评系统需求:将观众分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(比如 成功、失败 等) Man和Woman里面都有“成功”、“失败”的方法 【分析】 如果系统比较小,这样设置是可以的,但是考虑系统增加越来越多新的功能时,对代

    2024年02月14日
    浏览(33)
  • 设计模式之-访问者模式,快速掌握访问者模式,通俗易懂的讲解访问者模式以及它的使用场景

    当谈到访问者模式时,我们可以通过以下方式进行详细解释: 访问者模式是一种行为型设计模式,它允许你在不修改已有代码的情况下,向现有对象结构添加新的操作。该模式将操作(或方法)封装在称为访问者的独立对象中,使得可以在不修改元素类的情况下,通过访问者

    2024年02月03日
    浏览(43)
  • 设计模式——访问者模式

    访问者模式(Visitor Pattern)是一种行为型设计模式,它主要用于在不修改现有类结构的前提下向对象结构添加新的操作。访问者模式通过定义一个访问者接口,使得可以在不改变元素类的情况下,为各个元素类增加新的功能。 元素接口(Element Interface): 定义了一个accept()方法

    2024年01月18日
    浏览(43)
  • 设计模式—访问者模式

     需求:店铺采购了一批水果(苹果及橘子),现在市场监督局来店里检查过期的水果。 如果此时再添加一个操作:找出新品上市的水果。 上述代码中,FruitMarket为应付新增操作,增加了相应的方法来满足要求,但这样破坏了FruitMarket的结构。 本质是将数据结构和数据操作分

    2024年02月10日
    浏览(44)
  • 【访问者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    访问者模式(Visitor Pattern)是一种行为型模式。它封装一个访问者类,把各元素类的操作集合起来,目的是将数据结构与数据操作分离。在不改变原有元素类数据结构的前提下,改变了元素类的执行算法。 当某些较为稳定的东西(数据结构或算法),不想直接被改变但又想扩

    2024年02月02日
    浏览(61)
  • 设计模式——19. 访问者模式

    访问者模式(Visitor Pattern)是一种行为型设计模式,它允许你在不改变元素类(被访问者)的前提下,定义对元素的新操作(访问者),并将这些操作封装到独立的访问者类中。这样,你可以在不修改被访问者的类的情况下,通过不同的访问者来执行不同的操作。 访问者模式

    2024年02月07日
    浏览(26)
  • js设计模式:访问者模式

    将操作方法封装在一个访问者对象中,而不是封装在每个被访问对象当中。 访问者对象可以通过调用被访问者的接口,用来操作被访问者。

    2024年02月22日
    浏览(37)
  • 设计模式之访问者模式(下)

    3)访问者模式与组合模式联用 1.概述 在访问者模式中,包含一个用于存储元素对象集合的对象结构,可以使用迭代器来遍历对象结构,同时具体元素之间可以存在整体与部分关系,有些元素作为容器对象,有些元素作为成员对象,可以使用组合模式来组织元素。 2.结构图

    2024年04月25日
    浏览(30)
  • 设计模式之访问者模式(上)

    访问者模式 1)概述 1.概念 访问者模式包含 访问者 和 被访问元素 两个主要组成部分。 处方单中的各种药品信息就是 被访问的元素 ,而划价人员和药房工作人员就是 访问者 ,被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。 被访问元素

    2024年04月25日
    浏览(29)
  • 设计模式:访问者模式(C++实现)

    访问者模式通过将对元素的操作与元素本身分离,使得可以在不修改元素类的情况下定义新的操作。 运行结果: 在上述代码中,Visitor是访问者接口,定义了访问具体元素的方法。Element是元素接口,定义了接受访问者访问的方法。ConcreteElementA和ConcreteElementB是具体元素类,实

    2024年02月07日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包