示例类图
访问者模式.png
示例代码
被访问对象(被操作对象)抽象层
- 定义了抽象方法,将对自身的操作权限交由IVisitor;
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);
}
被访问对象(被操作对象)具体层
- 将对自己的造作权限交由IVisitor;
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);
}
}
抽象访问层
- 在抽象层定义了对不同的具体被访问对象的访问逻辑是不一样的;
- 定义了我这个IVisitor掌握了对FreeCourse和CodingCourse的操作权限;
public interface IVisitor {
void visit(FreeCourse freeCourse);
void visit(CodingCourse codingCourse);
}
具体访问层
- 具体实现了针对不同具体被访问者的不同访问逻辑;
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()+"元");
}
}
客户端
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Course> courseList = new ArrayList<Course>();
FreeCourse freeCourse = new FreeCourse();
freeCourse.setName("SpringMVC数据绑定");
CodingCourse codingCourse = new CodingCourse();
codingCourse.setName("Java设计模式精讲 -- By Geely");
codingCourse.setPrice(299);
courseList.add(freeCourse);
courseList.add(codingCourse);
for(Course course : courseList){
course.accept(new Visitor());
}
}
}
输出:
免费课程:SpringMVC数据绑定
实战课程:Java设计模式精讲 -- By Geely 价格:299元