一、访问者模式的定义与类型
1、定义
- 封装作用于某数据结构(如List、Set、Map等)中的各个元素的操作
- 可以在不改变各元素的类的前提下,定义作用于这些元素的操作
2、类型
- 行为型
- 一个数据结构(如List、Set、Map等)包含很多类型的对象
- 数据结构与数据操作分离
- 新增新的操作很容易,即增加一个新的访问者
- 增加新的数据结构困难
- 具体元素变更比较麻烦
- 访问者模式和迭代器模式
以访问者访问课程类型为例进行代码演示
1、代码结构如下:
2、定义一个课程的抽象类
package com.rf.designPatterns.behavioral.visitor;
/**
* @description: 定义一个课程的抽象类
* @author: xz
*/
public abstract class Course {
private String name;//课程名称
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void accept(Visitor visitor);
}
3、定义一个免费课程类
package com.rf.designPatterns.behavioral.visitor;
/**
* @description: 定义一个免费课程类
* @author: xz
*/
public class FreeCourse extends Course{
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
4、定义一个实战课程类
package com.rf.designPatterns.behavioral.visitor;
/**
* @description: 定义一个实战课程类
* @author: xz
*/
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(Visitor visitor) {
visitor.visit(this);
}
}
5、定义访问者接口类
package com.rf.designPatterns.behavioral.visitor;
/**
* @description: 定义访问者接口类
* @author: xz
*/
public interface Visitor {
//访问免费课程方法
void visit(FreeCourse freeCourse);
//访问实战课程方法
void visit(CodingCourse codingCourse);
}
6、定义访问者接口的实现类
package com.rf.designPatterns.behavioral.visitor;
/**
* @description: 定义访问者实现类
* @author: xz
*/
public class VisitorImpl implements Visitor{
//访问免费课程,打印所有免费课程名称
@Override
public void visit(FreeCourse freeCourse) {
System.out.println("免费课程:"+freeCourse.getName());
}
//访问实战课程,打印所有实战课程名称和价格
@Override
public void visit(CodingCourse codingCourse) {
System.out.println("实战课程:"+codingCourse.getName()+",价格:"+codingCourse.getPrice());
}
}
7、访问者模式的测试类
package com.rf.designPatterns.behavioral.visitor;
import java.util.ArrayList;
import java.util.List;
/**
* @description: 访问者模式的测试类
* @author: xz
*/
public class Test {
public static void main(String[] args) {
List list=new ArrayList();
//声明一个免费课程
FreeCourse freeCourse = new FreeCourse();
freeCourse.setName("springboot课程");
//声明一个实战课程
CodingCourse codingCourse = new CodingCourse();
codingCourse.setName("java设计模式课程");
codingCourse.setPrice(99);
list.add(freeCourse);
list.add(codingCourse);
for(Course c:list){
c.accept(new VisitorImpl());
}
}
}
8、运行测试类输出结果如下: 9、UML类图如下: