/** * 访问者接口 */ public interface Visitor { /** * 访问A * @param element */ void visit(ConcreteElementA element); /** * 访问B * @param element */ void visit(ConcreteElementB element); } /** * 被访问对象接口 */ public interface Element { void accept(Visitor visitor); String operation(); } /** * 具体的访问者 */ public class ConcreteVisitor implements Visitor { @Override public void visit(ConcreteElementA element) { System.out.println("visit: " + element.operation()); } @Override public void visit(ConcreteElementB element) { System.out.println("visit: " + element.operation()); } } /** * 具体实例A */ public class ConcreteElementA implements Element { @Override public void accept(Visitor visitor) { visitor.visit(this); } @Override public String operation() { return "ConcreteElementA"; } } /** * 具体实例B */ public class ConcreteElementB implements Element { @Override public void accept(Visitor visitor) { visitor.visit(this); } @Override public String operation() { return "ConcreteElementB"; } }
/** * 测试与应用类 */ public class Test { public static void main(String[] args) { //初始化被访问列表 List<Element> elements = new ArrayList<>(); //初始化访问者 Visitor visitor = new ConcreteVisitor(); //初始化元素 Element element1 = new ConcreteElementA(); Element element2 = new ConcreteElementB(); //装填 elements.add(element1); elements.add(element2); //访问 elements.forEach(e -> e.accept(visitor)); } }
visit: ConcreteElementA visit: ConcreteElementB
访问者中的元素html
使用访问者模式,实现对不一样种类课程的访问封装。
/** * 访问者接口 */ 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("free course: " + freeCourse.getName()); } @Override public void visit(CodingCourse codingCourse) { System.out.println("coding course: " + codingCourse.getName() + " price: " + codingCourse.getPrice()); } } /** * 抽象类,课程 */ public abstract class Course { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } abstract void accept(IVisitor visitor); } /** * 具体的实体类,免费课程 */ public class FreeCourse extends Course { @Override 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 void accept(IVisitor visitor) { visitor.visit(this); } }
/** * 测试与应用类 */ public class Test { public static void main(String[] args) { //初始化容器 List<Course> courses = new ArrayList<>(); //构建课程实现 FreeCourse freeCourse = new FreeCourse(); freeCourse.setName("SpringMVC."); CodingCourse codingCourse = new CodingCourse(); codingCourse.setName("Java design pattern."); codingCourse.setPrice(299); //装填 courses.add(freeCourse); courses.add(codingCourse); //访问 for (Course course : courses) { course.accept(new Visitor()); } } }
free course: SpringMVC. coding course: Java design pattern. price: 299
访问者模式和迭代器模式java
慕课网设计模式精讲
:https://coding.imooc.com/class/270.html 访问者模式(Visitor模式)详解
: http://c.biancheng.net/view/1397.html