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

访问者模式

时间:2023-03-03 14:13:46浏览次数:45  
标签:计算机 void visit accept 模式 public 访问者

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

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

 

一个访问者模式的例子。

这个例子中,有一个计算机组件的接口(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.

 

 

标签:计算机,void,visit,accept,模式,public,访问者
From: https://www.cnblogs.com/LJXXXX/p/17175388.html

相关文章

  • Book-深入设计模式
    Book-深入设计模式https://refactoringguru.cn/design-patternshttps://github.com/RefactoringGuruhttps://github.com/RefactoringGuru/design-patterns-cpp设计模......
  • 22-享元模式
    22-享元模式概念享元模式(flyweight),运用共享技术有效地支撑大量细粒度的对象享元模式可以避免大量非常相似的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示......
  • 关于解决UEditor源码模式下提交保存样式 样式是乱的
             问题1这个项目的UEditor是用来编辑页面的 每个页面又有不同的模块 然而业务部门有时候是会直接从别的模块直接复制源代码然后在可视模式......
  • 装饰模式
    概述《设计模式》一书中对于“装饰模式”的动机描述如下:动态地给一个对象添加一些额外的职责按照SOLID面向对象编程原则中的O(开闭原则),对于功能的修改应当关闭,而......
  • 创建型:工厂模式-简单工厂
    定义之所以叫简单工厂是因为真的非常简单,只要一个工厂(函数)就可以了,如果把被创建的对象称为产品,把创建产品的对象或者方法称为工厂,那么只需要传入不同的参数,就可以......
  • 456. 132 模式
    给你一个整数数组nums,数组中共有n个整数。132模式的子序列由三个整数nums[i]、nums[j]和nums[k]组成,并同时满足:i<j<k和nums[i]<nums[k]<nums[j]。......
  • 软件体系架构方面英文文章翻译----Android中MVC、MVP和MVVM架构模式的区别
    DifferenceBetweenMVC,MVPandMVVMArchitecturePatterninAndroid22Dec,2022Developinganandroidapplicationbyapplyingasoftwarearchitecturepattern......
  • 设计模式3——结构型模式
    结构型模式描述如何将类或对象按某种布局组成更大的结构,它分为类结构型和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或聚合来组合对象。由于组合关系或聚......
  • 16进制颜色转RGB模式带透明度
    functiontoColorRgba(color,opacity){//16进制颜色值的正则varreg=/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;//把颜色变成小写varcolor=col......
  • 创建型:构造器模式
    简介构造器模式,也被称为建造者、生成器模式,是设计模式中比较容易理解的模式之一。定义:将一个对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。定义不......