源代码
GitHub源代码
1.本文目标
本文目标是为了让大家认识并理解访问者模式
2.基本套路
定义:封装作用于某数据结构(比如List,Set,Map等)中的个元素的操作
类型:行为型
选择关键点:数据结构是否稳定以及操作是否经常变化
设计原则:遵循倾斜的开闭原则
使用概率:5%
难度系数:高
3.适用场景
1.一个数据结构如(List/Set/Map等)包含很多类型对象
2.数据结构与数据操作分类
4.使用步骤
用栗子能更好的说明问题,请继续往下看
5.举个栗子
我们用具体的代码去更好的理解这个设计模式
5.1栗子说明
- 背景:网站上有免费课程和付费课程
- 目的:用访问者模式模拟
5.2使用步骤
实现代码如下:
步骤1.创建课程类
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);
}
步骤2.创建Visitor 接口
public interface IVisitor {
//访问免费课程
void visit(FreeCourse freeCourse);
//访问付费课程
void visit(CodingCourse codingCourse);
}
步骤3. 创建免费课程和代码付费课程
public class FreeCourse extends Course {
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
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);
}
}
步骤4. 创建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()+"元");
}
}
步骤5. 测试
public static void main(String[] args) {
List<Course> courseList = new ArrayList<>();
//免费课程
FreeCourse freeCourse = new FreeCourse();
freeCourse.setName("Android基础");
//付费课程
CodingCourse codingCourse = new CodingCourse();
codingCourse.setName("Java设计模式精讲");
codingCourse.setPrice(299);
courseList.add(freeCourse);
courseList.add(codingCourse);
for (Course course : courseList) {
course.accept(new Visitor());
}
}
6.优点
- 增加新的操作很容易,就是增加一个新的访问者
7.缺点
- 增加新的数据结构困难
- 具体元素变更比较麻烦
8.总结
本文只是对访问者模式进行一个分享,接下来会从创建型模式,结构型模式,行为型模式,这三大类展开一个系列分享,大家可以持续进行关注,信仰年輕的设计模式,蟹蟹啦。











网友评论