封装做用于某数据结构(如List/Set/Map等)中的各元素的操做
能够在不改变各元素的类的前提下,定义做用于这些元素的操做
类型:行为型spring
一个数据结构如(List/Set/Map等)包含不少类型对象
数据结构与数据操做分离设计模式
增长新的操做很容易,即增长一个新的访问者数据结构
具体元素变动比较麻烦ide
访问者模式和迭代器模式
共同点:都是在某种数据结构上进行处理,例如List、Map、Set
访问者模式主要用于 对保存在数据结构中的元素进行某种特定的处理
迭代器模式主要用于 逐个遍历保存在数据结构中的元素测试
模拟场景:针对免费课程和实战课程,访问者作出不一样的行为this
课程抽象类:设计
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(免费课程):code
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); } }
访问者接口:blog
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