设计模式之访问者模式

简介:访问者模式是一种将算法与对象结构分离的行为型模式。基本想法如下:首先我们拥有一个由许多对象构成的对象结构,这些对象的类都拥有一个accept方法用来接受访问者对象;访问者是一个接口,它拥有一个visit方法,这个方法对访问到的对象结构中不同类型的元素作出不同的反应;在对象结构的一次访问过程中,我们遍历整个对象结构,对每一个元素都实施accept方法,在每一个元素的accept方法中回调访问者的visit方法,从而使访问者得以处理对象结构的每一个元素。我们可以针对对象结构设计不同的实在的访问者类来完成不同的操作。
优点:1、符合单一职责原则。 2、优秀的扩展性。 3、灵活性。
缺点:1、具体元素对访问者公布细节,违反了迪米特原则。 2、具体元素变更比较困难,开发难度大。 3、违反了依赖倒置原则,依赖了具体类,没有依赖抽象。
概要设计:我们将创建一个定义接受操作的 ComputerPart 接口。Keyboard、Mouse、Monitor 和 Computer 是实现了 ComputerPart 接口的实体类。我们将定义另一个接口 ComputerPartVisitor,它定义了访问者类的操作。Computer 使用实体访问者来执行相应的动作。
VisitorPatternDemo,我们的演示类使用 Computer、ComputerPartVisitor 类来演示访问者模式的用法。
在这里插入图片描述
代码
步骤 1
定义一个表示元素的接口。

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

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

public class Keyboard implements ComputerPart {

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

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

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

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

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

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

public class ComputerPartDisplayVisitor implements ComputerPartVisitor {

	public void visit(Computer computer) {
		System.out.println("访问电脑\n");
	}

	public void visit(Mouse mouse) {
		System.out.println("访问鼠标\n");
	}

	public void visit(Keyboard keyboard) {
		System.out.println("访问键盘\n");
	}

	public void visit(Monitor monitor) {
		System.out.println("访问显示屏\n");
	}
}

步骤 5
使用 ComputerPartDisplayVisitor 来显示 Computer 的组成部分。

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

结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值