当前位置: 首页 >  网技达人 >  访问者模式

访问者模式

导读:访问者模式是一种将算法与对象结构分离的软件设计模式。它可以让你在不修改对象结构的情况下,对对象结构中的元素进行不同的操作。访问者模式的优点是符合单一职责原则,优秀的扩展性和灵活性。缺点是具体元素对访问者公布细节,违反了迪米特原则,而且如果元素类经常变化,会导致访问者类需要频繁修改

访问者模式是一种将算法与对象结构分离的软件设计模式。它可以让你在不修改对象结构的情况下,对对象结构中的元素进行不同的操作。访问者模式的优点是符合单一职责原则,优秀的扩展性和灵活性。缺点是具体元素对访问者公布细节,违反了迪米特原则,而且如果元素类经常变化,会导致访问者类需要频繁修改。

访问者模式适合在以下场景下使用:
- 对象结构比较稳定,但经常需要在此对象结构上定义新的操作。
- 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类。
- 对象结构中的元素类型很少变化,但每个元素都有很多种变化的可能性,并且每一种变化都影响到元素的行为。

一个访问者模式的例子。

这个例子中,有一个计算机组件的接口(ComputerPart),它有一个accept方法用来接受访问者对象(ComputerPartVisitor)。

然后有三个实现了这个接口的类:键盘(Keyboard),鼠标(Mouse)和显示器(Monitor)。

每个类都实现了accept方法,调用访问者对象的visit方法,并传递自身作为参数。

访问者对象是一个接口,它有三个visit方法,分别对应三种不同的计算机组件。然后有两个实现了这个接口的类:计算机显示访问者(ComputerDisplayVisitor)和计算机修理访问者(ComputerRepairVisitor)。

每个类都实现了三个visit方法,分别对不同的计算机组件执行不同的操作。

最后,有一个计算机类(Computer),它包含了三种计算机组件,并且也实现了accept方法,调用每个组件的accept方法,并传递自身作为参数。下面是部分代码:

// 计算机组件接口
public interface ComputerPart {
public void accept(ComputerPartVisitor computerPartVisitor);
}

// 键盘类
public class Keyboard implements ComputerPart {

@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}

// 鼠标类
public class Mouse implements ComputerPart {

@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}

// 显示器类
public class Monitor implements ComputerPart {

@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}

// 访问者接口
public interface ComputerPartVisitor {
public void visit(Keyboard keyboard);
public void visit(Mouse mouse);
public void visit(Monitor monitor);
}

// 计算机显示访问者类
public class ComputerDisplayVisitor implements ComputerPartVisitor {

@Override
public void visit(Keyboard keyboard) {
System.out.println("Displaying Keyboard.");
}

@Override
public void visit(Mouse mouse) {
System.out.println("Displaying Mouse.");
}

@Override
public void visit(Monitor monitor) {
System.out.println("Displaying Monitor.");
}
}

// 计算机修理访问者类
public class ComputerRepairVisitor implements ComputerPartVisitor {

@Override
public void visit(Keyboard keyboard) {
System.out.println("Repairing Keyboard.");
}

@Override
public void visit(Mouse mouse) {
System.out.println("Repairing Mouse.");
}

@Override
public void visit(Monitor monitor) {
System.out.println("Repairing Monitor.");
}
}

// 计算机类

public class Computer implements ComputerPart {

private final List<ComputerComponent> components;

// 构造函数初始化键盘、鼠标和显示器

// 实现accept方法

// 调用每个组件的accept方法,并传递自身作为参数

}

这段代码的目的是演示访问者模式的用法,它定义了一个计算机组件的接口,和三个实现了这个接口的类,分别代表键盘、鼠标和显示器。这些类都有一个accept方法,用来接受一个访问者对象,并调用它的visit方法。访问者对象是一个接口,它有三个visit方法,分别对应三种不同的计算机组件。这个接口有两个实现类,分别是计算机显示访问者和计算机修理访问者。这两个类都实现了三个visit方法,分别对不同的计算机组件执行不同的操作。例如,计算机显示访问者会打印出每个组件的名称,而计算机修理访问者会打印出每个组件正在被修理。最后,有一个计算机类,它包含了三种计算机组件,并且也实现了accept方法。当调用这个方法时,它会遍历所有的组件,并调用它们的accept方法,并传递自身作为参数。这样就可以根据不同的访问者对象,在不修改原有类结构和行为的情况下,对每个组件执行不同的操作。

假设我们创建了一个计算机对象,然后分别用计算机显示访问者和计算机修理访问者来访问它,那么运行结果可能是这样的:

// 创建一个计算机对象
Computer computer = new Computer();

// 创建一个计算机显示访问者对象
ComputerDisplayVisitor displayVisitor = new ComputerDisplayVisitor();
// 调用计算机的accept方法,并传递显示访问者对象
computer.accept(displayVisitor);

// 输出结果:
Displaying Keyboard.
Displaying Mouse.
Displaying Monitor.

// 创建一个计算机修理访问者对象
ComputerRepairVisitor repairVisitor = new ComputerRepairVisitor();

// 调用计算机的accept方法,并传递修理访问者对象
computer.accept(repairVisitor);

// 输出结果:
Repairing Keyboard.
Repairing Mouse.
Repairing Monitor.
内容
  • RocketMQ消费者是如何负载均衡的
    RocketMQ消费者是如何负载
    2023-12-09
    摘要:RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )
  • 布隆过滤器:后端开发者必学的知识点!
    布隆过滤器:后端开发者必学的知识
    2023-12-09
    摘要: 对于后端程序员来讲,学习和理解布隆过滤器有很大的必要性。来吧,我们一起品味布隆过滤器的设计之美。.本文分享自华为
  • 详解数据结构中栈的定义和操作
    详解数据结构中栈的定义和操作
    2023-12-08
    摘要: 本文为大家详解数据结构中栈的定义和操作。.本文分享自华为云社区《数据结构:详细讲解栈的定义、栈的操作》,作者:
  • 记一次burp抓不到包的排查与处理
    记一次burp抓不到包的排查与处
    2023-12-07
    ​ 一次遇到了burp上奇怪的bug。访问某个页面显示 No response received from remote
  • 码龄几十年的老程序员都不知道的存图小技巧“指向立体星”  学到就是赚到!速戳>>
    码龄几十年的老程序员都不知道的存
    2023-12-05
    河北小伙深耕OI被图论困扰多年 终于研究出最新的存图方式 速看!.原文.宣传博客主页.在图论中,我们经常使用不同种的数据
  • 零信任介绍
    零信任介绍
    2023-12-04
    什么是零信任?.答:.零信任是一种条件访问控制模型,需要持续进行信任验证,然后才允许对应用和数据进行最低权限访问。零信任
  • FlashDuty Changelog 2023-09-07 | 新增深色模式与主题配置
    FlashDuty Change
    2023-12-04
    FlashDuty:一站式告警响应平台,前往此地址免费体验!.FlashDuty.现在已经全面支持了深色模式,这为您提供
  • DVWA靶场实战(九)——Weak Session IDS
    DVWA靶场实战(九)——Wea
    2023-12-03
    DVWA靶场实战(九).九、Weak Session IDS:.1.漏洞原理:.Weak Session.IDS也叫做弱
  • 实时光线追踪(3)Ray Casting
    实时光线追踪(3)Ray Cas
    2023-12-01
    目录.硬件光追(Hardware Ray Tracing).加速结构(Acceleration Structure,AS
  • 女童连衣裙
    女童连衣裙
    2024-01-15
    女童连衣裙.产品功能.高品质面料:选用优质的面料,柔软舒适,给孩子最佳的穿着体验.精美设计:精致的工艺和设计,展现孩子的
  • 长裤
    长裤
    2023-12-06
    产品介绍:长裤.产品功能.长裤是一种常见的服装单品,主要用于覆盖双腿,保暖和保护身体。随着时尚的发展,长裤也成为了一种时
  • 男童短裤
    男童短裤
    2023-12-31
    男童短裤.产品功能.我们的男童短裤是为年轻活泼的男孩设计的。它采用了透气轻便的面料,让孩子在炎热的夏天也能感到舒适。弹性
  • 儿童T恤
    儿童T恤
    2023-12-26
    儿童T恤.儿童T恤是一种专门为儿童设计的上衣,具有舒适、时尚、环保等特点,是孩子们*常穿着的必备单品。.产品功能.儿童T
  • 儿童运动服
    儿童运动服
    2023-12-16
    儿童运动服.产品功能.我们的儿童运动服采用高品质的面料和工艺制作而成,具有出色的透气性和舒适性,可以让孩子在运动中保持干
  • 衬衫
    衬衫
    2023-12-31
    产品介绍:衬衫.产品功能.衬衫是一种适合各种场合穿着的服装,既可以正式地穿在工作场所,也可以搭配牛仔裤穿在休闲场合。.衬
  • 男童卫衣
    男童卫衣
    2024-01-05
    男童卫衣.产品功能.保暖:采用优质纯棉面料,舒适保暖,让孩子在冬季也能保持舒适的温暖。.时尚:经典设计搭配可爱的图案,时
  • 女童裤子
    女童裤子
    2024-01-10
    女童裤子.产品介绍.我们的女童裤子是为年龄在3-12岁之间的女孩设计的。我们的裤子不仅样式多样,而且舒适耐穿,适合学校、
  • 短裤
    短裤
    2023-12-11
    时尚舒适,让您夏日更自在.产品功能.采用轻薄、透气的面料,给您清新舒适的穿着体验.弹性腰头设计,更贴合您的腰部曲线,穿着
  • 牛仔裤
    牛仔裤
    2024-01-05
    牛仔裤.牛仔裤,是一种起源于美国的经典服装单品,以其耐穿耐磨的特性,成为了时尚界不可或缺的一部分。无论是男女老少,都能在