首页 > 其他分享 >访问者模式

访问者模式

时间:2024-08-20 09:05:26浏览次数:13  
标签:void 元素 接口 Computer 模式 public 访问者

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 双龙物流

介绍

意图

旨在将数据结构与在该数据结构上执行的操作分离,从而使得添加新的操作变得更容易,而无需修改数据结构本身。

主要解决的问题

  • 解决在稳定数据结构和易变操作之间的耦合问题,使得操作可以独立于数据结构变化。

使用场景

  • 当需要对一个对象结构中的对象执行多种不同的且不相关的操作时,尤其是这些操作需要避免"污染"对象类本身。

实现方式

  • 定义访问者接口:声明一系列访问方法,一个访问方法对应数据结构中的一个元素类。
  • 创建具体访问者:实现访问者接口,为每个访问方法提供具体实现。
  • 定义元素接口:声明一个接受访问者的方法。
  • 创建具体元素:实现元素接口,每个具体元素类对应数据结构中的一个具体对象。

关键代码

  • 访问者接口:包含访问不同元素的方法。
  • 具体访问者:实现了访问者接口,包含对每个元素类的访问逻辑。
  • 元素接口:包含一个接受访问者的方法。
  • 具体元素:实现了元素接口,提供给访问者访问的入口。

应用实例

  • 做客场景:访问者(如您)访问朋友家,朋友作为元素提供信息,访问者根据信息做出判断。

优点

  • 单一职责原则:访问者模式符合单一职责原则,每个类只负责一项职责。
  • 扩展性:容易为数据结构添加新的操作。
  • 灵活性:访问者可以独立于数据结构变化。

缺点

  • 违反迪米特原则:元素需要向访问者公开其内部信息。
  • 元素类难以变更:元素类需要维持与访问者的兼容。
  • 依赖具体类:访问者模式依赖于具体类而不是接口,违反了依赖倒置原则。

使用建议

  • 当对象结构稳定,但需要在其上定义多种新操作时,考虑使用访问者模式。
  • 当需要避免操作"污染"对象类时,使用访问者模式封装操作。

注意事项

  • 访问者模式可以用于功能统一,如报表生成、用户界面显示、拦截器和过滤器等。

包含的几个主要角色

  • 访问者(Visitor)

    • 定义了访问元素的接口。
  • 具体访问者(Concrete Visitor)

    • 实现访问者接口,提供对每个具体元素类的访问和相应操作。
  • 元素(Element)

    • 定义了一个接受访问者的方法。
  • 具体元素(Concrete Element)

    • 实现元素接口,提供一个accept方法,允许访问者访问并操作。
  • 对象结构(Object Structure)(可选)

    • 定义了如何组装具体元素,如一个组合类。
  • 客户端(Client)(可选)

    • 使用访问者模式对对象结构进行操作。

实现 双龙物流

我们将创建一个定义接受操作的 ComputerPart 接口。KeyboardMouseMonitor 和 Computer 是实现了 ComputerPart 接口的实体类。我们将定义另一个接口 ComputerPartVisitor,它定义了访问者类的操作。Computer 使用实体访问者来执行相应的动作。

VisitorPatternDemo,我们的演示类使用 ComputerComputerPartVisitor 类来演示访问者模式的用法。

访问者模式的 UML 图

步骤 1

定义一个表示元素的接口。

ComputerPart.java

public interface ComputerPart { public void accept(ComputerPartVisitor computerPartVisitor); }

步骤 2

创建扩展了上述类的实体类。

Keyboard.java

public class Keyboard implements ComputerPart { @Override public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } }

Monitor.java

public class Monitor implements ComputerPart { @Override public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } }

Mouse.java

public class Mouse implements ComputerPart { @Override public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } }

Computer.java

public class Computer implements ComputerPart { ComputerPart[] parts; public Computer(){ parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()}; } @Override public void accept(ComputerPartVisitor computerPartVisitor) { for (int i = 0; i < parts.length; i++) { parts[i].accept(computerPartVisitor); } computerPartVisitor.visit(this); } }

步骤 3

定义一个表示访问者的接口。

ComputerPartVisitor.java

public interface ComputerPartVisitor { public void visit(Computer computer); public void visit(Mouse mouse); public void visit(Keyboard keyboard); public void visit(Monitor monitor); }

步骤 4

创建实现了上述类的实体访问者。

ComputerPartDisplayVisitor.java

public class ComputerPartDisplayVisitor implements ComputerPartVisitor { @Override public void visit(Computer computer) { System.out.println("Displaying Computer."); } @Override public void visit(Mouse mouse) { System.out.println("Displaying Mouse."); } @Override public void visit(Keyboard keyboard) { System.out.println("Displaying Keyboard."); } @Override public void visit(Monitor monitor) { System.out.println("Displaying Monitor."); } }

步骤 5

 双龙物流使用 ComputerPartDisplayVisitor 来显示 Computer 的组成部分。

VisitorPatternDemo.java

public class VisitorPatternDemo { public static void main(String[] args) { ComputerPart computer = new Computer(); computer.accept(new ComputerPartDisplayVisitor()); } }

步骤 6  双龙物流

执行程序,输出结果:

Displaying Mouse.
Displaying Keyboard.
Displaying Monitor.
Displaying Computer. 双龙物流

标签:void,元素,接口,Computer,模式,public,访问者
From: https://www.cnblogs.com/yingxining/p/18368704

相关文章

  • 基于STM32F407ZGT6芯片的GPIO工作模式
    目录4种输入模式4种输出模式输入模式模拟输入浮空输入上拉输入下拉输入输出模式推挽输出开漏输出复用推挽输出复用开漏输出4种输入模式(1)GPIO_Mode_IN_FLOATING浮空输入(2)GPIO_Mode_IPU上拉输入(3)GPIO_Mode_IPD下拉输入(4)GPIO_Mode_AIN模拟输入4种输出模......
  • 设计模式实战:即时通讯应用的设计与实现
    系统功能需求用户管理:支持用户注册、登录、注销、个人信息更新等功能。消息传递:支持即时消息发送、接收、存储和显示,支持文本、图片、语音等多种消息类型。在线状态管理:实时跟踪和显示用户的在线状态。消息通知:在消息到达时发送推送通知给用户。聊天记录管理:支持聊天......
  • 建造者模式 和 外观模式
    这两种模式很像,都是将一个复杂的流程统一用一个方法进行包装,方便外界使用.建造者模式更像是外观模式的一种特里,只对一个类的复杂初始化流程进行包装建造者模式简介:就是一个类的构造方法可能很复杂,由于系统的限制等原因,可能很多初始化逻辑不能放在构造函数里......
  • 工厂模式
    工厂模式核心本质:实例化对象不使用new,用工厂方法创建对象使用工厂统一管理对象的创建,将调用者跟实现类解耦三种模式:简单工厂模式建立一个工厂类,对实现了同一接口的一些类进行实例的创建。优点是比较好理解,简单易操作。缺点是类的创建依赖工厂类,如果想要拓展程序,必须对......
  • C# x Unity面向对象补全计划 设计模式 之 实现一个简单的有限状态机
    一个简单的有限状态机可以有如下内容1.状态基类(定义基本状态的方法,如进入(Enter)、执行(Execute)和退出(Exit),同时可以在此声明需要被管理的对象)2.具体状态类(定义具体状态,如:跳跃,行走,待机,每个具体状态类继承自状态基类)3.管理状态类(负责管理状态的切换逻辑,确保在不同状态之间进行......
  • 设计模式六大原则(二)--开闭原则
    1.简介1.1.概述开闭原则(Open/ClosedPrinciple,简称OCP)是软件设计原则中的一个重要原则,它指出:“软件实体(如类、模块、函数等)应该对扩展开放,对修改封闭。”这意味着我们应该设计出这样的软件实体,它们可以在不改变原有代码的基础上进行扩展和修改。开闭原则的核心思想是将......
  • PyCharm社区版配置Django 项目Debug模式配置
    1、编辑Django项目运行配置 2、选择python,点击添加 3、设置相关参数 ......
  • MySQL 安装与配置教程:单机、主从复制与集群模式
    目录MySQL简介MySQL安装MySQL基础配置MySQL主从复制配置MySQL集群配置总结1.MySQL简介MySQL是一个广泛使用的关系型数据库管理系统,具有高性能、高可靠性和易用性等特点。它支持多种部署模式,包括单机模式、主从复制模式(用于高可用性和读写分离)以及集群模式(用于分......
  • Redis 安装与配置教程:单机、哨兵模式与集群模式
    目录Redis简介Redis安装Redis单机配置Redis哨兵模式配置Redis集群模式配置总结1.Redis简介Redis是一个开源的键值对存储系统,支持丰富的数据结构,如字符串、哈希、列表、集合等。它被广泛用于缓存、会话存储、实时分析等场景。Redis提供了多种部署模式,包括单机模......
  • redis 哨兵模式开启方案
    哨兵模式一、配置sentinel模式二、测试sentinel日志输出的状态信息环境准备准备三台系统为CentOS7的主机master:192.168.152.71slave1:192.168.152.72slave2:192.168.152.73.哨兵模式的介绍:Redis哨兵模式(RedisSentinel)用于提供高可用性和监控功能,主要......