访问者模式

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 }

 

posted @ 2019-01-06 23:56  逢春  阅读(125)  评论(0编辑  收藏  举报