访问者模式
1.定义:封装作用于某数据结构(如List/Set/Map等)中的各元素的操作;
可以在不改变各元素的类的前提下,定义作用于这些元素的操作。
2.类型:行为型
3.适用场景:一个数据结构(如List/Set/Map等)包含很多类型对象;数据结构与数据操作分离。
4.优点:增加新的操作很容易,即增加一个新的访问者
5.缺点:增加新的数据结构困难;具体元素变更比较麻烦。
6.相关设计模式:迭代器模式
7.实例目录package
8.实例UML类图
9.代码
1 package com.geely.design.pattern.behavioral.visitor; 2 3 public abstract class Course { 4 private String name; 5 6 public String getName() { 7 return name; 8 } 9 10 public void setName(String name) { 11 this.name = name; 12 } 13 14 public abstract void accept(IVisitor visitor); 15 }
1 package com.geely.design.pattern.behavioral.visitor; 2 3 public class CodingCourse extends Course { 4 private int price; 5 6 public int getPrice() { 7 return price; 8 } 9 10 public void setPrice(int price) { 11 this.price = price; 12 } 13 @Override 14 public void accept(IVisitor visitor) { 15 visitor.visit(this); 16 } 17 }
1 package com.geely.design.pattern.behavioral.visitor; 2 3 public class FreeCourse extends Course { 4 5 @Override 6 public void accept(IVisitor visitor) { 7 visitor.visit(this); 8 } 9 }
1 package com.geely.design.pattern.behavioral.visitor; 2 3 public interface IVisitor { 4 void visit(FreeCourse freeCourse); 5 void visit(CodingCourse codingCourse); 6 }
1 package com.geely.design.pattern.behavioral.visitor; 2 3 public class Visitor implements IVisitor { 4 @Override 5 public void visit(FreeCourse freeCourse) { 6 System.out.println("免费课程:" + freeCourse.getName()); 7 } 8 9 @Override 10 public void visit(CodingCourse codingCourse) { 11 System.out.println("实战课程:" + codingCourse.getName() 12 + ",价格:" + codingCourse.getPrice()); 13 } 14 }
1 package com.geely.design.pattern.behavioral.visitor; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class Test { 7 public static void main(String[] args) { 8 List<Course> courseList = new ArrayList<>(); 9 10 FreeCourse freeCourse = new FreeCourse(); 11 freeCourse.setName("SpringMvc数据绑定"); 12 13 CodingCourse codingCourse = new CodingCourse(); 14 codingCourse.setName("Java设计模式精讲 -- By Geely"); 15 codingCourse.setPrice(299); 16 17 courseList.add(freeCourse); 18 courseList.add(codingCourse); 19 for (Course course : courseList){ 20 course.accept(new Visitor()); 21 } 22 } 23 }