From 3f52da257512db0a105dc83c7ba545f806227e40 Mon Sep 17 00:00:00 2001 From: fujiayang Date: Wed, 26 Jan 2022 10:37:13 +0800 Subject: [PATCH] =?UTF-8?q?spring=E5=A2=9E=E5=BC=BA=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E8=80=85=E6=A8=A1=E5=BC=8F-=E6=94=B9=E9=80=A0=E5=90=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../visitor/spring/after/DrawVisitor.java | 34 +++++++++++++++++++ .../visitor/spring/after/Visitor.java | 23 +++++++++++++ .../visitor/spring/bean/Building.java | 11 ++++++ .../behavior/visitor/spring/bean/Factory.java | 11 ++++++ .../behavior/visitor/spring/bean/Node.java | 4 +++ .../behavior/visitor/spring/bean/School.java | 11 ++++++ .../spring/{ => before}/DrawService.java | 2 +- .../visitor/spring/DrawServiceTest.java | 10 ++++++ 8 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/after/DrawVisitor.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/after/Visitor.java rename src/main/java/top/fjy8018/designpattern/pattern/behavior/visitor/spring/{ => before}/DrawService.java (98%) 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) {