diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/CodingCourse.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/CodingCourse.java new file mode 100644 index 0000000..92701ac --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/CodingCourse.java @@ -0,0 +1,21 @@ +package top.fjy8018.designpattern.pattern.behavior.visitor; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 实战课,包含价格 + * + * @author F嘉阳 + * @date 2020/7/22 10:20 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class CodingCourse extends Course { + private int price; + + @Override + public void accept(IVisitor visitor) { + visitor.visit(this); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/Course.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/Course.java new file mode 100644 index 0000000..99ece6f --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/Course.java @@ -0,0 +1,15 @@ +package top.fjy8018.designpattern.pattern.behavior.visitor; + +import lombok.Data; + +/** + * @author F嘉阳 + * @date 2020/7/22 10:20 + */ +@Data +public abstract class Course { + private String name; + + public abstract void accept(IVisitor visitor); + +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/FreeCourse.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/FreeCourse.java new file mode 100644 index 0000000..eb72b4e --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/FreeCourse.java @@ -0,0 +1,20 @@ +package top.fjy8018.designpattern.pattern.behavior.visitor; + +/** + * 免费课 + * + * @author F嘉阳 + * @date 2020/7/22 10:20 + */ +public class FreeCourse extends Course { + + /** + * 接受策略 + * + * @param visitor + */ + @Override + public void accept(IVisitor visitor) { + visitor.visit(this); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/IVisitor.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/IVisitor.java new file mode 100644 index 0000000..825206a --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/IVisitor.java @@ -0,0 +1,14 @@ +package top.fjy8018.designpattern.pattern.behavior.visitor; + +/** + * 封装操作数据结构的方法 + * + * @author F嘉阳 + * @date 2020/7/22 10:20 + */ +public interface IVisitor { + + void visit(FreeCourse freeCourse); + + void visit(CodingCourse codingCourse); +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/Visitor.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/Visitor.java new file mode 100644 index 0000000..ffb761a --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/Visitor.java @@ -0,0 +1,35 @@ +package top.fjy8018.designpattern.pattern.behavior.visitor; + +/** + * 访问者 + * 核心:对不同类型产生不同的操作行为 + *

+ * jdk源码 {@link java.nio.file.FileVisitor} 实现对文件的访问 + * spring源码 {@link org.springframework.beans.factory.config.BeanDefinitionVisitor} 遍历Bean具体属性并填充 + * + * @author F嘉阳 + * @date 2020/7/22 10:20 + */ +public class Visitor implements IVisitor { + + /** + * 访问免费课程,打印所有免费课程名称 + * + * @param freeCourse + */ + @Override + public void visit(FreeCourse freeCourse) { + System.out.println("免费课程:" + freeCourse.getName()); + } + + /** + * 访问实战课程,打印所有实战课程名称及价格 + * + * @param codingCourse + */ + @Override + public void visit(CodingCourse codingCourse) { + System.out.println("实战课程:" + codingCourse.getName() + " 价格:" + codingCourse.getPrice() + "元"); + } + +} diff --git a/src/test/java/top/fjy8018/designpattern/pattern/behavior/visitor/VisitorTest.java b/src/test/java/top/fjy8018/designpattern/pattern/behavior/visitor/VisitorTest.java new file mode 100644 index 0000000..45dc0da --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/pattern/behavior/visitor/VisitorTest.java @@ -0,0 +1,32 @@ +package top.fjy8018.designpattern.pattern.behavior.visitor; + +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author F嘉阳 + * @date 2020/7/22 16:19 + */ +class VisitorTest { + + @Test + void visit() { + List courseList = new ArrayList<>(); + + FreeCourse freeCourse = new FreeCourse(); + freeCourse.setName("SpringMVC数据绑定"); + + CodingCourse codingCourse = new CodingCourse(); + codingCourse.setName("Java设计模式精讲"); + codingCourse.setPrice(299); + // 数组组装 + courseList.add(freeCourse); + courseList.add(codingCourse); + + for (Course course : courseList) { + course.accept(new Visitor()); + } + } +} \ No newline at end of file