diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/after/DrawVisitor.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/after/DrawVisitor.java new file mode 100644 index 0000000..65e146b --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/after/DrawVisitor.java @@ -0,0 +1,34 @@ +package top.fjy8018.designpattern.pattern.behavior.visitor.spring.after; + +import top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean.Building; +import top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean.Factory; +import top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean.Node; +import top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean.School; + +/** + * TODO: + * + * @author F嘉阳 + * @date 2022/1/26 10:31 + */ +public class DrawVisitor implements Visitor { + @Override + public void visit(Node node) { + System.out.println("draw node"); + } + + @Override + public void visit(Factory factory) { + System.out.println("draw factory"); + } + + @Override + public void visit(Building building) { + System.out.println("draw building"); + } + + @Override + public void visit(School school) { + System.out.println("draw school"); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/after/Visitor.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/after/Visitor.java new file mode 100644 index 0000000..03ca427 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/after/Visitor.java @@ -0,0 +1,23 @@ +package top.fjy8018.designpattern.pattern.behavior.visitor.spring.after; + +import top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean.Building; +import top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean.Factory; +import top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean.Node; +import top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean.School; + +/** + * Visitor Pattern + * + * @author F嘉阳 + * @date 2022/1/26 10:31 + */ +public interface Visitor { + + void visit(Node node); + + void visit(Factory factory); + + void visit(Building building); + + void visit(School school); +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/bean/Building.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/bean/Building.java index b696928..e5b0e1a 100644 --- a/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/bean/Building.java +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/bean/Building.java @@ -1,5 +1,7 @@ package top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean; +import top.fjy8018.designpattern.pattern.behavior.visitor.spring.after.Visitor; + /** * TODO: * @@ -16,4 +18,13 @@ public class Building implements Node { public String getDescription() { return null; } + + /** + * 调用方知道visit的参数就是Building类型的,并且知道Visitor::visit(Building)方法确实存在, + * 因此会直接调用Visitor::visit(Building)方法 + */ + @Override + public void accept(Visitor v) { + v.visit(this); + } } diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/bean/Factory.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/bean/Factory.java index 5cf8678..03137dd 100644 --- a/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/bean/Factory.java +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/bean/Factory.java @@ -1,5 +1,7 @@ package top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean; +import top.fjy8018.designpattern.pattern.behavior.visitor.spring.after.Visitor; + /** * TODO: * @@ -16,4 +18,13 @@ public class Factory implements Node { public String getDescription() { return null; } + + /** + * 调用方知道visit的参数就是Factory类型的,并且知道Visitor::visit(Factory)方法确实存在, + * 因此会直接调用Visitor::visit(Factory)方法 + */ + @Override + public void accept(Visitor v) { + v.visit(this); + } } diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/bean/Node.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/bean/Node.java index 12a8370..0950da5 100644 --- a/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/bean/Node.java +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/bean/Node.java @@ -1,5 +1,7 @@ package top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean; +import top.fjy8018.designpattern.pattern.behavior.visitor.spring.after.Visitor; + /** * 地图节点 * @@ -11,4 +13,6 @@ public interface Node { String getName(); String getDescription(); + + void accept(Visitor v); } diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/bean/School.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/bean/School.java index b73d84d..3340154 100644 --- a/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/bean/School.java +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/bean/School.java @@ -1,5 +1,7 @@ package top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean; +import top.fjy8018.designpattern.pattern.behavior.visitor.spring.after.Visitor; + /** * TODO: * @@ -16,4 +18,13 @@ public class School implements Node { public String getDescription() { return null; } + + /** + * 调用方知道visit的参数就是School类型的,并且知道Visitor::visit(School)方法确实存在, + * 因此会直接调用Visitor::visit(School)方法 + */ + @Override + public void accept(Visitor v) { + v.visit(this); + } } diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/DrawService.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/before/DrawService.java similarity index 98% rename from src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/DrawService.java rename to src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/before/DrawService.java index 646dc4f..4f4162f 100644 --- a/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/DrawService.java +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/before/DrawService.java @@ -1,4 +1,4 @@ -package top.fjy8018.designpattern.pattern.behavior.visitor.spring; +package top.fjy8018.designpattern.pattern.behavior.visitor.spring.before; import top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean.Building; import top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean.Factory; diff --git a/src/test/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/DrawServiceTest.java b/src/test/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/DrawServiceTest.java index 1b6acc3..eb1fff0 100644 --- a/src/test/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/DrawServiceTest.java +++ b/src/test/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/DrawServiceTest.java @@ -2,10 +2,13 @@ package top.fjy8018.designpattern.pattern.behavior.visitor.spring; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; +import top.fjy8018.designpattern.pattern.behavior.visitor.spring.after.DrawVisitor; +import top.fjy8018.designpattern.pattern.behavior.visitor.spring.after.Visitor; import top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean.Building; import top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean.Factory; import top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean.Node; import top.fjy8018.designpattern.pattern.behavior.visitor.spring.bean.School; +import top.fjy8018.designpattern.pattern.behavior.visitor.spring.before.DrawService; /** * DrawService中只有4个draw方法,参数类型分别是Factory, Building, School和Node,如果调用方传了一个City进来怎么办? @@ -26,6 +29,13 @@ class DrawServiceTest { draw(new Factory()); } + @Test + public void draw2() { + Visitor drawVisitor = new DrawVisitor(); + Factory factory = new Factory(); + factory.accept(drawVisitor); + } + private void draw(Node node) { DrawService drawService = new DrawService(); if (node instanceof Building) {