设计模式 - 访客模式( Visitor Pattern)

在Visitor模式中,我们使用一个访问者类来更改元素类的执行算法。 通过这种方式,元素的执行算法可以随着访问者的变化而变化。 此模式属于行为模式类别。 根据模式,元素对象必须接受访问者对象,以便访问者对象处理元素对象上的操作。

实现 (Implementation)

我们将创建一个定义接受操作的ComputerPart接口。 Keyboard , Mouse , Monitor和Computer是实现ComputerPart接口的具体类。 我们将定义另一个接口ComputerPartVisitor ,它将定义一个访问者类操作。 Computer使用具体访问者做相应的动作。

VisitorPatternDemo ,我们的演示类,将使用Computer和ComputerPartVisitor类来演示访问者模式的使用。

Step 1

定义表示元素的接口。

ComputerPart.java public interface ComputerPart {

public void accept(ComputerPartVisitor computerPartVisitor);

}

Step 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);

}

}

Step 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);

}

Step 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.");

}

}

Step 5

使用ComputerPartDisplayVisitor显示Computer部分。

VisitorPatternDemo.java public class VisitorPatternDemo {

public static void main(String[] args) {

ComputerPart computer = new Computer();

computer.accept(new ComputerPartDisplayVisitor());

}

}

Step 6

验证输出。Displaying Mouse.

Displaying Keyboard.

Displaying Monitor.

Displaying Computer.

设计模式 - 模板模式( Template Pattern)

java 访客模式,设计模式 - 访客模式( Visitor Pattern)相关推荐

  1. Java进阶专题(七) 设计模式之委派模式与策略模式

    一.前言 今天开始我们专题的第七课了.本章节将介绍:你写的代码中是否觉得很臃肿,程序中有大量的if...else,想优化代码,精简程序逻辑,提升代码的可读性,这章节将介绍如何通过委派模式.策略模式让你 ...

  2. java外观设计修改_Java设计模式之外观模式和装饰器模式的设计(精选)

    前言 本篇来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接 ...

  3. 格力电器Java面试题_JAVA设计模式学习--工厂模式

    今天谈一下对工厂模式学习的总结. 看完视频和文章之后要自己表述工厂模式,总是感觉无从说起,不知道怎么去定义工厂模式,反复看了几遍之后终于理解一点. 自己理解工厂模式是通过这两种模式的特点来理解和定义的 ...

  4. java 工厂方法_java设计模式-工厂方法模式

    1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...

  5. java 消费者模式 多线程_[Java并发-24-并发设计模式] 生产者-消费者模式,并发提高效率...

    生产者 - 消费者模式在编程领域的应用非常广泛,前面我们曾经提到,Java 线程池本质上就是用生产者 - 消费者模式实现的,所以每当使用线程池的时候,其实就是在应用生产者 - 消费者模式. 当然,除了 ...

  6. app+java代码模板_软件设计模式之模板方法模式(JAVA)

    什么是模板方法模式? 定义一个操作中算法的骨架,而将这些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 好抽象的概念啊,文绉绉的东西就是不讨人喜欢,下面我 ...

  7. java 事件链_Java设计模式——责任链模式(Chain of Responsibility)

    责任链 责任链模式通俗来说就是关联一串能够处理事务的对象,使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. ...

  8. Java实现23种设计模式(五):桥接模式

    二十三种设计模式分类 一.概述 桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化.它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度.桥接模式主要想实 ...

  9. php 命令链模式,设计模式之------命令链模式

    /*** **命令链模式:松散耦合为主题,发送消息,命令和请求通过一组命令 **封装一系列操作 ** 一条命令被看做只执行了一个函数 ********/ Interface ICommand{ fun ...

最新文章

  1. linux 查看库的安装信息
  2. 一个页面是否应该全部组件化
  3. dotNet Core使用SignalR实现websocket
  4. 【MaxCompute学习】隐式转化的问题
  5. [恢]hdu 2040
  6. RTOS原理与实现05:事件控制块实现
  7. matlab p q的确定,基于MATLAB软件的P-Q分解法潮流计算 (1)
  8. SQL Server 2008每天自动备份数据库
  9. docker部署sftp,连接报algorithm negotiation fail错误
  10. 标书怎么做?标书制作教程附标书制作思维导图
  11. 废旧光盘手工小制作_变废为宝:废旧CD光盘制作纸巾盒
  12. 使用 Python 从谷歌搜索结果中抓取图像
  13. 阿里在线免费图标库的使用
  14. 前端学习——17——获取窗口属性,dom尺寸,让滚动条滚动
  15. 借助MPU6050上手卡尔曼滤波
  16. 基于佟刚老师视频教程的Spring MVC数据类型转换学习总结
  17. 微信小程序——开发介绍
  18. 主板外形尺寸 ATX 介绍
  19. 基于AdaBoost的人脸检测
  20. git提交用户名与当前用户名不止一致(或者邮箱)

热门文章

  1. 捣蛋猪PC版免费完美破解教程
  2. 小白学Python之爬虫篇(二)——隐式资源链接查找与爬取
  3. html5css如何引用,html如何调用外部css
  4. 这就是传说中超难的N皇后?——详细图解!
  5. c语言2字节16进制转10进制,C语言中十六进制转十进制两种实现方法
  6. 算法竞赛入门经典第二版:循环结构程序设计实例与习题
  7. rknn3399pro 2小时入门指南(一)基础概念和基本开发流程
  8. [.ashx檔?泛型处理程序?]基础入门#5....ADO.NET 与 将DB里面的二进制图片还原 (范例下载 大型控件的ImageField)...
  9. 今天接待了一对中年夫妻的咨询
  10. 三星Android p 卡,购买经历 篇二:三星S10 半个月使用心得