本设计模式资料源于慕课网,讲师:Geely 《Java设计模式精讲 Debug方式+内存分析》,本人作为自己手打整理作为学习的归纳总结。
一,模式介绍
1,定义和类型
- 定义:封装作用于某数据结构(如List/Set/Map)中的各元素的操作
- 可以在不改变各元素的类的前提下,定义作用于这些元素的各种操作
- 类型:行为型
2,适用场景
- 一个数据结构(如List/Set/Map)包含很多类型对象
- 数据结构和数据操作分离
3,优点
- 增加新的操作很容易,即增加一个新的访问者
4,缺点
- 增加新的数据结构很困难
- 具体元素变更比较麻烦
5,相关设计模式
- 访问者模式和迭代器模式
二,代码演示
- 业务场景
实现对免费和收费课程的两种访问方式
课程抽象类
package com.try1.design.behavioral.visitor;
public abstract class Course {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void accept(IVisitor visitor);
}
免费课程继承类
package com.try1.design.behavioral.visitor;
public class FreeCourse extends Course {
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
收费课程继承类
package com.try1.design.behavioral.visitor;
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);
}
}
观察者接口类
package com.try1.design.behavioral.visitor;
public interface IVisitor {
void visit(FreeCourse freeCourse);
void visit(CodingCourse codingCourse);
}
接口实现类
package com.try1.design.behavioral.visitor;
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());
}
}
测试类
package com.try1.design.behavioral.visitor;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Course> courseList=new ArrayList<>();
FreeCourse freeCourse=new FreeCourse();
freeCourse.setName("SpringMVC数据绑定");
CodingCourse codingCourse=new CodingCourse();
codingCourse.setName("Java设计模式精讲");
codingCourse.setPrice(299);
courseList.add(freeCourse);
courseList.add(codingCourse);
for(Course course:courseList){
course.accept(new Visitor());
}
}
}
运行截图
三,小结
- 访问者模式是通过在定义一个访问目标抽象类,在这个抽象类要实现一个访问者的引用,同时再利用访问者类的多态,不同的继承类会有不同的访问方法