1 概念
1 定义
2 应用场景
- 需要对对象结构中的元素进行多种不相关或不一致的操作,而不希望在元素类中增加这些操作的情况。
- 需要对不同类型的元素执行不同的操作,而又不希望使用条件语句或类型判断来实现的情况。
3 优缺点
优点:
- 增加新的操作很容易 , 只需要增加一个新的访问者即可
缺点:
2 代码实现
场景:课程分为免费课程和VIP课程 , 用户分为 免费用户 和 VIP用户 ;不同的用户 , 访问不同的课程 , 各自有不同的效果 ;
1 2 3 4 5 6 7 8 9 10
| @Data public abstract class Course { private String name;
public abstract void accept(IVisitor visitor); }
|
1 2 3 4 5 6 7 8
| public class FreeCourse extends Course { @Override public void accept(IVisitor visitor) { visitor.visit(this); } }
|
1 2 3 4 5 6 7 8 9 10
| @Data public class VIPCourse extends Course { private int price;
@Override public void accept(IVisitor visitor) { visitor.visit(this); } }
|
1 2 3 4 5
| public interface IVisitor { void visit(FreeCourse freeCourse); void visit(VIPCourse VIPCourse); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class VIPVisitor implements IVisitor {
@Override public void visit(FreeCourse freeCourse) { System.out.println("我是 VIP, 可以访问:免费课程:"+freeCourse.getName()); }
@Override public void visit(VIPCourse VIPCourse) { System.out.println("我是 VIP ,可以访问VIP课程:"+ VIPCourse.getName()+" 价格:"+ VIPCourse.getPrice()+"元"); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class Test { public static void main(String[] args) { List<Course> courseList = new ArrayList<Course>();
FreeCourse freeCourse = new FreeCourse(); freeCourse.setName("SpringMVC数据绑定");
VIPCourse VIPCourse = new VIPCourse(); VIPCourse.setName("Java设计模式精讲"); VIPCourse.setPrice(299);
courseList.add(freeCourse); courseList.add(VIPCourse);
for(Course course : courseList){ course.accept(new VIPVisitor()); } } }
|
输出:
我是 VIP, 可以访问:免费课程:SpringMVC数据绑定
我是 VIP ,可以访问VIP课程:Java设计模式精讲 价格:299元