2020-09-08

访问者模式

一、访问者模式介绍

1、定义与类型

封装作用于某数据结构(如List/Set/Map等)中的各元素的操作
可以在不改变各元素的类的前提下,定义作用于这些元素的操作
类型:行为型

2、适用场景

一个数据结构如(List/Set/Map等)包含很多类型对象
数据结构与数据操作分离

3、优点

增加新的操作很容易,即增加一个新的访问者

4、缺点

具体元素变更比较麻烦

5、相关设计模式

访问者模式和迭代器模式
共同点:都是在某种数据结构上进行处理,例如List、Map、Set
访问者模式主要用于 对保存在数据结构中的元素进行某种特定的处理
迭代器模式主要用于 逐个遍历保存在数据结构中的元素

二、代码示例

模拟场景:针对免费课程和实战课程,访问者做出不同的行为

课程抽象类:

public abstract class Course { private String name; public void setName(String name) {  this.name = name; } public String getName() {  return name; } public abstract void accept(IVisitor visitor);}

课程实现类1(免费课程):

public class FreeCourse extends Course { @Override public void accept(IVisitor visitor) {  visitor.visit(this); }}

课程实现类2(实战课程):

public class CodingCourse extends Course { private int price; public int getPrice() {  return price; } public void setPrice(int price) {  this.price = price; } @Override public void accept(IVisitor visitor) {  visitor.visit(this); }}

访问者接口:

public interface IVisitor { void visit(FreeCourse freeCourse); void visit(CodingCourse codingCourse);}

访问者实现类:

public class Visitor implements IVisitor { @Override public void visit(FreeCourse freeCourse) {  System.out.println("免费课程 : " + freeCourse.getName()); } @Override public void visit(CodingCourse codingCourse) {  System.out.println("实战课程 : " + codingCourse.getName() + ",价格 : " + codingCourse.getPrice()) ; }}

测试类:

public class Test { public static void main(String[] args) {  List<Course> courseList = new ArrayList<Course>();  FreeCourse freeCourse = new FreeCourse();  freeCourse.setName("SpringMVC");  CodingCourse codingCourse = new CodingCourse();  codingCourse.setName("访问者模式讲解");  codingCourse.setPrice(99);  courseList.add(freeCourse);  courseList.add(codingCourse);  for (Course course : courseList) {   course.accept(new Visitor());  } }}

输出:
免费课程 : SpringMVC
实战课程 : 访问者模式讲解,价格 : 99

三、源码示例

1、Jdk中的FileVisitor

2、Spring中的BeanDefinitionVisitor

访问者模式marks spencer丰趣海淘2017开年沙龙 涵哥&招商经理喊你一起聊亚马逊亚马逊广告结构化运营核心思维重磅!中美第一阶段经贸协议落实!欧盟延长对医疗物资免税!亚马逊网络服务部和亚马逊零售部将要从亚马逊分裂出去?2019全新亚马逊广告全攻略全面涨价,中国邮政速递上调美国路向部分产品资费标准!

No comments:

Post a Comment