访问者模式(十八)

这篇具有很好参考价值的文章主要介绍了访问者模式(十八)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

相信自己,请一定要相信自己

上一章简单介绍了命令模式(十七), 如果没有看过, 请观看上一章

一. 访问者模式

引用 菜鸟教程里面访问者模式介绍: https://www.runoob.com/design-pattern/visitor-pattern.html

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。

通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。

根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作

一.一 介绍

意图: 主要将数据结构与数据操作分离。

主要解决: 稳定的数据结构和易变的操作耦合问题。

何时使用: 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封装到类中。

如何解决: 在被访问的类里面加一个对外提供接待访问者的接口。

关键代码: 在数据基础类里面有一个方法接受访问者,将自身引用传入访问者。

应用实例: 您在朋友家做客,您是访问者,朋友接受您的访问,您通过朋友的描述,然后对朋友的描述做出一个判断,这就是访问者模式。

优点: 1、符合单一职责原则。 2、优秀的扩展性。 3、灵活性。

缺点: 1、具体元素对访问者公布细节,违反了迪米特原则。 2、具体元素变更比较困难。 3、违反了依赖倒置原则,依赖了具体类,没有依赖抽象。

使用场景: 1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。 2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,也不希望在增加新操作时修改这些类。

注意事项: 访问者可以对功能进行统一,可以做报表、UI、拦截器与过滤器。


组成角色 具体 关系
抽象访问者(Visitor)角色 Action 一个访问具体元素的接口,为每个具体元素类对应一个访问操作 visit() ,该操作中的参数类型标识了被访问的具体元素
具体访问者(ConcreteVisitor)角色 FailAction, SuccessAction 实现抽象访问者角色中声明的各个访问操作,确定访问者访问一个元素时该做什么
抽象元素(Element)角色 Person 声明一个包含接受操作 accept() 的接口,被接受的访问者对象作为 accept() 方法的参数
具体元素(ConcreteElement)角色 Man WoMan 实现抽象元素角色提供的 accept() 操作,其方法体通常都是 visitor.visit(this) ,另外具体元素中可能还包含本身业务逻辑的相关操作
对象结构(Object Structure)角色 ObjectStructure 是一个包含元素角色的容器,提供让访问者对象遍历容器中的所有元素的方法,通常由 List、Set、Map 等聚合类实现

访问者模式(十八)

二. 访问者实例

二. 一 抽象访问者 Action

public abstract class Action {

    public abstract void getManResult (Man man);

    public abstract void getWomanResult(WoMan woMan);
}

二.二 具体访问者实现

二.二.一 差

@Slf4j
public class FailAction extends Action{

    @Override
    public void getManResult(Man man) {
        log.info("男生{}评价差",man.getName());
    }

    @Override
    public void getWomanResult(WoMan woMan) {
        log.info("女生评价{}差",woMan.getName());
    }
}

二.二.二 优

@Slf4j
public class SuccessAction extends Action{

    @Override
    public void getManResult(Man man) {
        log.info("男生{}评价优秀",man.getName());
    }

    @Override
    public void getWomanResult(WoMan woMan) {
        log.info("女生评价{}优秀",woMan.getName());
    }
}

二.二.三 待评价

@Slf4j
public class WaitAction extends Action{

    @Override
    public void getManResult(Man man) {
        log.info("男生{} 待评价",man.getName());
    }

    @Override
    public void getWomanResult(WoMan woMan) {
        log.info("女生{}待评价",woMan.getName());
    }
}

二.三 抽象元素 Person

@EqualsAndHashCode(of = {"name"})
public abstract class Person {
    private String name;

    public abstract  void accept(Action action);

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

二.四 具体元素

二.四.一 男人

public class Man extends Person{
    public Man (String name) {
        super.setName(name);
    }
    @Override
    public void accept(Action action) {
        action.getManResult(this);
    }
}

二.四.二 女人

public class WoMan extends Person{
    public WoMan (String name) {
       super.setName(name);
    }
    @Override
    public void accept(Action action) {
        action.getWomanResult(this);
    }
}

二.五 对象结构 ObjectStructure

public class ObjectStructure {

    private List<Person> personList = new ArrayList<>();

    public void accept( Person person) {
        personList.add(person);
    }

    public void remove(Person person) {
        personList.remove(person);
    }

    public void display (Action action) {
        for (Person person : personList) {
            person.accept(action);
        }
    }
}

二.六 测试

@Test
    public void oneTest() {
        ObjectStructure objectStructure = new ObjectStructure();
        objectStructure.accept(new Man("张三"));
        // 是成功的
        objectStructure.display(new SuccessAction());

        objectStructure.remove(new Man("张三"));
        objectStructure.accept(new Man("李四"));

        objectStructure.display(new FailAction());

        objectStructure.remove(new Man("李四"));
        objectStructure.accept(new WoMan("王二"));
        objectStructure.accept(new WoMan("麻子"));

        objectStructure.display(new WaitAction());

    }

访问者模式(十八)

优点:

  1. 访问者模式符合单一职责原则、让程序具有优秀的扩展性、灵活性非常高

  2. 访问者模式可以对功能进行统一,可以做报表、UI、拦截器与过滤器,适用于数据结构相对稳定的系统

缺点:

  1. 具体元素对访问者公布细节,也就是说访问者关注了其他类的内部细节,这是迪米特法则所不建议的, 这样造 成了具体元素变更比较困难

  2. 违背了依赖倒转原则。访问者依赖的是具体元素,而不是抽象元素

  3. 因此,如果一个系统有比较稳定的数据结构,又有经常变化的功能需求,那么访问者模式就是比较合适的.


本章节的代码放置在 github 上:


https://github.com/yuejianli/DesignPattern/tree/develop/Visitor


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!文章来源地址https://www.toymoban.com/news/detail-496410.html

到了这里,关于访问者模式(十八)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【设计模式与范式:行为型】69 | 访问者模式(下):为什么支持双分派的语言不需要访问者模式?

    上一节课中,我们学习了访问者模式的原理和实现,并且还原了访问者模式诞生的思维过程。总体上来讲,这个模式的代码实现比较难,所以应用场景并不多。从应用开发的角度来说,它的确不是我们学习的重点。 不过,我们前面反复说过,学习我的专栏,并不只是让你掌握

    2024年02月10日
    浏览(45)
  • 访问者模式【行为模式C++】

    1.概述       访问者模式 是一种行为设计模式, 它能将算法与其所作用的对象隔离开来。       访问者模式主要解决的是数据与算法的耦合问题,尤其是在数据结构比较稳定,而算法多变的情况下。为了不污染数据本身,访问者会将多种算法独立归档,并在访问数据时根据

    2024年04月16日
    浏览(31)
  • 设计模式——19. 访问者模式

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

    2024年02月07日
    浏览(38)
  • 访问者模式(Visitor)

    访问者模式是一种行为设计模式,可封装一些作用于当前数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。 访问者模式包含如下角色: Visitor,访问者基类,声明了一系列以对象结构的具体元素为参数的访问者方法。这些方法的名

    2024年02月13日
    浏览(28)
  • 设计模式之访问者模式(上)

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

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

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

    2024年04月25日
    浏览(44)
  • Java设计模式-访问者模式

    在软件开发领域中,设计模式是解决常见问题的经典方法。其中,访问者模式是一种强大且灵活的设计模式,用于处理对象结构中的元素,并根据不同的访问者实现不同的操作。 访问者模式是一种行为型设计模式,它允许你在不改变元素类的前提下定义新的操作。该模式将算

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

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

    2024年02月22日
    浏览(64)
  • 《访问者模式(极简c++)》

            本文章属于专栏- 概述 - 《设计模式(极简c++版)》-CSDN博客 模式说明 方案:将数据结构与数据操作分离,使得数据结构可以在不改变的情况下,添加新的操作。 优点:增加新的操作易于扩展,符合开闭原则;将相关行为封装在一起,使得代码易于维护。 缺点:

    2024年04月12日
    浏览(31)
  • java 实现访问者模式

    访问者模式是一种行为设计模式,它允许您在不修改对象结构的情况下,向对象结构中的元素添加新的操作。这通常用于解决对象结构中元素类型多变,但操作类型相对稳定的问题。在访问者模式中,我们有一个访问者接口和多个具体的元素类,每个元素类都可以接受访问者

    2024年02月09日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包