前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 设计模式系列(24) —— 访问者模式

Java 设计模式系列(24) —— 访问者模式

作者头像
求和小熊猫
发布2021-02-02 14:59:17
2970
发布2021-02-02 14:59:17
举报
文章被收录于专栏:∑小熊猫的博客

访问者模式

访问者模式是封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改,接受这个操作的数据结构则可以保持不变

访问者模式的定义 封装一些用于某种数据结构中的各元素的操作,他可以在不改变数据结构的前提下定义这些元素的新操作。

访问者模式的参与者:

  • visitor 抽象访问者:该角色声明一个或多个访问操作,定义访问者可以访问那些元素
  • Concrete Visitor 具体访问者角色:该角色实现抽象访问角色中的各个操作
  • Element 抽象元素角色:该角色声明一个接受操作接受一个访问者对象
  • Concrete Element 具体元素角色:该角色实现抽象元素中的接受操作
  • Object Structure 结构对象角色:该角色一般用于容纳多个元素对象,一般情况下,很难抽象出这个角色。
访问者模式的简单示例
在这里插入图片描述
在这里插入图片描述

抽象元素角色

代码语言:javascript
复制
public interface Element {
	public void doSomething();
	//声明一个接受操作,接受一个访问者对象
	public void accept(Visitor v);
}

具体元素角色

  1. 具体元素1
代码语言:javascript
复制
public class ConcreteElement1 implements Element {

	@Override
	public void doSomething() {
		System.out.println("与模范1坐在一起聊天");
	}
	// 实现抽象元素中的接受操作
	@Override
	public void accept(Visitor v) {
		v.visit(this);
	}

}
  1. 具体元素2
代码语言:javascript
复制
public class ConcreteElement2 implements Element {

	@Override
	public void doSomething() {
		System.out.println("与模范2吃家常饭");

	}

	@Override
	public void accept(Visitor v) {
		v.visit(this);
	}

}

抽象访问者角色

代码语言:javascript
复制
public interface Visitor {
	// 声明访问者要访问那些元素
	public void visit(ConcreteElement1 e1);
	public void visit(ConcreteElement2 e2);
}

具体访问者角色

  1. 访问者1
代码语言:javascript
复制
public class ConcreteVisitor1 implements Visitor {
	// 实现访问方法的具体过程
	@Override
	public void visit(ConcreteElement1 e1) {
		System.out.println("1号领导嘘寒问暖,然后握手");
		System.out.print("1号领导");
		e1.doSomething();
		
	}

	@Override
	public void visit(ConcreteElement2 e2) {
		System.out.println("1号领导视察生活条件,然后握手");
		System.out.print("1号领导");
		e2.doSomething();
	}
	
}
  1. 访问者2
代码语言:javascript
复制
public class ConcreteVisitor2 implements Visitor {

	@Override
	public void visit(ConcreteElement1 e1) {
		System.out.println("2号领导表示亲切慰问");
		System.out.print("2号领导");
		e1.doSomething();
		
	}

	@Override
	public void visit(ConcreteElement2 e2) {
		System.out.println("2号领导表示亲切关怀");
		System.out.print("2号领导");
		e2.doSomething();
		
	}

}

结构对象角色

代码语言:javascript
复制
public class ObjectStructure {
	private Vector<Element> elements;
	
	public ObjectStructure(){
		this.elements = new  Vector<>();
	}
	
	public void add(Element e) {
		elements.add(e);
	}
	
	public void action(Visitor vi){
		for (Element e: elements) {
			e.accept(vi);
		}
	}

}
访问者模式的优缺点和使用场景

访问者模式的优点

  • 访问者模式使得易于增加新的操作
  • 访问者集中相关操作而分离无关操作
  • 符合单一职责原则

访问者模式的缺点

  • 增加新的 ConcreteElement 类很困难
  • 具体元素对访问者公布细节
  • 违背了依赖倒置原则

访问者模式的使用场景

  • 一个对象结构有很多类,他们有不同的接口,当对这些对象实施依赖于具体类的操作时,即使用迭代器模式下不能胜任的场景
  • 需要对一个对象结构中进行很多不同且不相关的操作,避免操作污染类
  • 业务规则要求遍历多个不同对象,迭代器模式只能访问相同类或同接口的数据,而访问者模式是对迭代器模式的扩充,可以遍历不同的对象,执行不同的操作。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 访问者模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档