From 0aeefd7e05c70a9ebd243f7f1ab1bdd8a9e722c5 Mon Sep 17 00:00:00 2001 From: luoxiang <2806718453@qq.com> Date: Sun, 8 Dec 2019 08:43:00 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/Java/design-pattern/pom.xml | 5 ++ .../behavioral/state/CloseState.java | 14 ++++++ .../behavioral/state/PauseState.java | 9 ++++ .../behavioral/state/PlayState.java | 5 ++ .../heibaiying/behavioral/state/Player.java | 47 +++++++++++++++++++ .../behavioral/state/SpeedState.java | 9 ++++ .../heibaiying/behavioral/state/State.java | 26 ++++++++++ .../heibaiying/behavioral/state/ZTest.java | 13 +++++ .../behavioral/visitor/Archive.java | 8 ++++ .../behavioral/visitor/Company.java | 24 ++++++++++ .../behavioral/visitor/DepartManager.java | 14 ++++++ .../behavioral/visitor/President.java | 14 ++++++ .../behavioral/visitor/PublicArchive.java | 11 +++++ .../behavioral/visitor/SecretArchive.java | 11 +++++ .../behavioral/visitor/Visitor.java | 6 +++ .../heibaiying/behavioral/visitor/ZTest.java | 11 +++++ .../structural/flyweight/ArtPPT.java | 13 +++++ .../structural/flyweight/BusinessPPT.java | 13 +++++ .../structural/flyweight/PPTFactory.java | 26 ++++++++++ .../structural/flyweight/PowerPoint.java | 27 +++++++++++ .../structural/flyweight/SciencePPT.java | 13 +++++ .../structural/flyweight/ZTest.java | 16 +++++++ .../proxy/cglib/ComputeService.java | 7 +++ .../structural/proxy/cglib/Proxy.java | 36 ++++++++++++++ .../structural/proxy/cglib/ZTest.java | 9 ++++ .../proxy/dynamic_proxy/ComputeService.java | 8 ++++ .../proxy/dynamic_proxy/IService.java | 5 ++ .../structural/proxy/dynamic_proxy/ZTest.java | 19 ++++++++ .../proxy/static_proxy/ComputeService.java | 8 ++++ .../proxy/static_proxy/IService.java | 5 ++ .../proxy/static_proxy/ProxyService.java | 17 +++++++ .../structural/proxy/static_proxy/ZTest.java | 8 ++++ notes/Java_设计模式.md | 15 +++++- 33 files changed, 470 insertions(+), 2 deletions(-) create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/CloseState.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/PauseState.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/PlayState.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/Player.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/SpeedState.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/State.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/ZTest.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/Archive.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/Company.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/DepartManager.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/President.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/PublicArchive.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/SecretArchive.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/Visitor.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/ZTest.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/ArtPPT.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/BusinessPPT.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/PPTFactory.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/PowerPoint.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/SciencePPT.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/ZTest.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/cglib/ComputeService.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/cglib/Proxy.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/cglib/ZTest.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/dynamic_proxy/ComputeService.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/dynamic_proxy/IService.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/dynamic_proxy/ZTest.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/static_proxy/ComputeService.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/static_proxy/IService.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/static_proxy/ProxyService.java create mode 100644 code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/static_proxy/ZTest.java diff --git a/code/Java/design-pattern/pom.xml b/code/Java/design-pattern/pom.xml index 0dff2d4..9055d05 100644 --- a/code/Java/design-pattern/pom.xml +++ b/code/Java/design-pattern/pom.xml @@ -27,6 +27,11 @@ 1.18.10 provided + + cglib + cglib + 3.3.0 + \ No newline at end of file diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/CloseState.java b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/CloseState.java new file mode 100644 index 0000000..3a5fc84 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/CloseState.java @@ -0,0 +1,14 @@ +package com.heibaiying.behavioral.state; + +public class CloseState extends State { + + @Override + public void pause() { + System.out.println("操作失败:视频已处于关闭状态,无需暂停"); + } + + @Override + public void speed() { + System.out.println("操作失败:视频已处于关闭状态,无法加速"); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/PauseState.java b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/PauseState.java new file mode 100644 index 0000000..502e7f5 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/PauseState.java @@ -0,0 +1,9 @@ +package com.heibaiying.behavioral.state; + +public class PauseState extends State { + + @Override + public void speed() { + System.out.print("操作失败:暂停状态下不支持加速"); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/PlayState.java b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/PlayState.java new file mode 100644 index 0000000..594b5d8 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/PlayState.java @@ -0,0 +1,5 @@ +package com.heibaiying.behavioral.state; + +public class PlayState extends State { + +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/Player.java b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/Player.java new file mode 100644 index 0000000..f967dec --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/Player.java @@ -0,0 +1,47 @@ +package com.heibaiying.behavioral.state; + +public class Player { + + private State state; + + public final static PlayState PLAY_STATE = new PlayState(); + public final static PauseState PAUSE_STATE = new PauseState(); + public final static CloseState CLOSE_STATE = new CloseState(); + public final static SpeedState SPEED_STATE = new SpeedState(); + + public State getState() { + return state; + } + + public void setState(State state) { + this.state = state; + this.state.setPlayer(this); + } + + Player() { + // 假设播放器初始状态为关闭 + this.state = new CloseState(); + this.state.setPlayer(this); + } + + public void paly() { + System.out.println("播放视频"); + state.paly(); + } + + public void pause() { + System.out.println("暂停视频"); + state.pause(); + } + + public void close() { + System.out.println("关闭视频"); + state.close(); + } + + public void speed() { + System.out.println("视频加速"); + state.speed(); + } + +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/SpeedState.java b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/SpeedState.java new file mode 100644 index 0000000..000af72 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/SpeedState.java @@ -0,0 +1,9 @@ +package com.heibaiying.behavioral.state; + +public class SpeedState extends State { + + @Override + public void paly() { + System.out.println("你当前已处于加速播放状态"); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/State.java b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/State.java new file mode 100644 index 0000000..3a5350d --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/State.java @@ -0,0 +1,26 @@ +package com.heibaiying.behavioral.state; + +public class State { + + private Player player; + + public void setPlayer(Player player) { + this.player = player; + } + + public void paly() { + player.setState(Player.PLAY_STATE); + } + + public void pause() { + player.setState(Player.PAUSE_STATE); + } + + public void close() { + player.setState(Player.CLOSE_STATE); + } + + public void speed() { + player.setState(Player.SPEED_STATE); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/ZTest.java b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/ZTest.java new file mode 100644 index 0000000..7be8189 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/state/ZTest.java @@ -0,0 +1,13 @@ +package com.heibaiying.behavioral.state; + +public class ZTest { + public static void main(String[] args) { + Player player = new Player(); + player.speed(); + player.paly(); + player.speed(); + player.pause(); + player.close(); + player.speed(); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/Archive.java b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/Archive.java new file mode 100644 index 0000000..66e62e4 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/Archive.java @@ -0,0 +1,8 @@ +package com.heibaiying.behavioral.visitor; + +/** + * 档案 + */ +public interface Archive { + void accept(Visitor visitor); +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/Company.java b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/Company.java new file mode 100644 index 0000000..96270f3 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/Company.java @@ -0,0 +1,24 @@ +package com.heibaiying.behavioral.visitor; + +import java.util.ArrayList; +import java.util.List; + +public class Company { + + private List archives = new ArrayList<>(); + + void add(Archive archive) { + archives.add(archive); + } + + void remove(Archive archive) { + archives.remove(archive); + } + + void accept(Visitor visitor) { + for (Archive archive : archives) { + archive.accept(visitor); + } + } + +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/DepartManager.java b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/DepartManager.java new file mode 100644 index 0000000..72c55a0 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/DepartManager.java @@ -0,0 +1,14 @@ +package com.heibaiying.behavioral.visitor; + +public class DepartManager implements Visitor { + + @Override + public void visit(PublicArchive publicArchive) { + System.out.println("所有公开档案"); + } + + @Override + public void visit(SecretArchive secretArchive) { + System.out.println("三级以下权限的加密档案"); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/President.java b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/President.java new file mode 100644 index 0000000..70ac647 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/President.java @@ -0,0 +1,14 @@ +package com.heibaiying.behavioral.visitor; + +public class President implements Visitor { + + @Override + public void visit(PublicArchive publicArchive) { + System.out.println("所有公开档案"); + } + + @Override + public void visit(SecretArchive secretArchive) { + System.out.println("所有加密档案"); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/PublicArchive.java b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/PublicArchive.java new file mode 100644 index 0000000..ec07dc1 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/PublicArchive.java @@ -0,0 +1,11 @@ +package com.heibaiying.behavioral.visitor; + +/** + * 公开档案 + */ +public class PublicArchive implements Archive { + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/SecretArchive.java b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/SecretArchive.java new file mode 100644 index 0000000..f6a3d25 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/SecretArchive.java @@ -0,0 +1,11 @@ +package com.heibaiying.behavioral.visitor; + +/** + * 加密档案 + */ +public class SecretArchive implements Archive { + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/Visitor.java b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/Visitor.java new file mode 100644 index 0000000..c8108cb --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/Visitor.java @@ -0,0 +1,6 @@ +package com.heibaiying.behavioral.visitor; + +public interface Visitor { + void visit(PublicArchive publicArchive); + void visit(SecretArchive secretArchive); +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/ZTest.java b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/ZTest.java new file mode 100644 index 0000000..370dad1 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/behavioral/visitor/ZTest.java @@ -0,0 +1,11 @@ +package com.heibaiying.behavioral.visitor; + +public class ZTest { + public static void main(String[] args) { + Company company = new Company(); + company.add(new SecretArchive()); + company.add(new PublicArchive()); + company.accept(new DepartManager()); + company.accept(new President()); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/ArtPPT.java b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/ArtPPT.java new file mode 100644 index 0000000..1d8c5ab --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/ArtPPT.java @@ -0,0 +1,13 @@ +package com.heibaiying.structural.flyweight; + +public class ArtPPT extends PowerPoint { + + public ArtPPT(String copyright) { + super(copyright); + } + + @Override + void create() { + System.out.println("艺术类PPT模板"); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/BusinessPPT.java b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/BusinessPPT.java new file mode 100644 index 0000000..b0537d3 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/BusinessPPT.java @@ -0,0 +1,13 @@ +package com.heibaiying.structural.flyweight; + +public class BusinessPPT extends PowerPoint { + + public BusinessPPT(String copyright) { + super(copyright); + } + + @Override + void create() { + System.out.println("商务类PPT模板"); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/PPTFactory.java b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/PPTFactory.java new file mode 100644 index 0000000..4d872a6 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/PPTFactory.java @@ -0,0 +1,26 @@ +package com.heibaiying.structural.flyweight; + + +import java.lang.reflect.Constructor; +import java.util.HashMap; + +public class PPTFactory { + + private HashMap hashMap = new HashMap<>(); + + public PowerPoint getPPT(Class clazz) { + try { + String name = clazz.getName(); + if (hashMap.keySet().contains(name)) { + return hashMap.get(name); + } + Constructor constructor = Class.forName(name).getConstructor(String.class); + PowerPoint powerPoint = (PowerPoint) constructor.newInstance("PPT工厂版本所有"); + hashMap.put(name, powerPoint); + return powerPoint; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/PowerPoint.java b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/PowerPoint.java new file mode 100644 index 0000000..a3a79cd --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/PowerPoint.java @@ -0,0 +1,27 @@ +package com.heibaiying.structural.flyweight; + +import lombok.ToString; + +public abstract class PowerPoint { + /*版权*/ + private String copyright; + private String title; + + public PowerPoint(String copyright) { + this.copyright = copyright; + } + + public void setTitle(String title) { + this.title = title; + } + + abstract void create(); + + @Override + public String toString() { + return "编号:" + hashCode() + ": PowerPoint{" + + "copyright='" + copyright + '\'' + + ", title='" + title + '\'' + + '}'; + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/SciencePPT.java b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/SciencePPT.java new file mode 100644 index 0000000..fa12ad7 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/SciencePPT.java @@ -0,0 +1,13 @@ +package com.heibaiying.structural.flyweight; + +public class SciencePPT extends PowerPoint { + + public SciencePPT(String copyright) { + super(copyright); + } + + @Override + void create() { + System.out.println("科技类PPT模板"); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/ZTest.java b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/ZTest.java new file mode 100644 index 0000000..d23ed31 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/flyweight/ZTest.java @@ -0,0 +1,16 @@ +package com.heibaiying.structural.flyweight; + +public class ZTest { + public static void main(String[] args) { + PPTFactory pptFactory = new PPTFactory(); + PowerPoint ppt01 = pptFactory.getPPT(BusinessPPT.class); + ppt01.setTitle("第一季度工作汇报"); + System.out.println(ppt01); + PowerPoint ppt02 = pptFactory.getPPT(BusinessPPT.class); + ppt02.setTitle("第二季度工作汇报"); + System.out.println(ppt02); + PowerPoint ppt03 = pptFactory.getPPT(SciencePPT.class); + ppt03.setTitle("科技展汇报"); + System.out.println(ppt03); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/cglib/ComputeService.java b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/cglib/ComputeService.java new file mode 100644 index 0000000..2861632 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/cglib/ComputeService.java @@ -0,0 +1,7 @@ +package com.heibaiying.structural.proxy.cglib; + +public class ComputeService { + public void compute() { + System.out.println("业务处理"); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/cglib/Proxy.java b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/cglib/Proxy.java new file mode 100644 index 0000000..62c056b --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/cglib/Proxy.java @@ -0,0 +1,36 @@ +package com.heibaiying.structural.proxy.cglib; + +import net.sf.cglib.proxy.Enhancer; +import net.sf.cglib.proxy.MethodInterceptor; +import net.sf.cglib.proxy.MethodProxy; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class Proxy implements MethodInterceptor { + + private Object target; + + public Proxy(Object target) { + this.target = target; + } + + public Object getProxyInstance() { + // 创建用于生成生成动态子类的工具类 + Enhancer enhancer = new Enhancer(); + // 指定动态生成类的父类 + enhancer.setSuperclass(target.getClass()); + // 设置回调 + enhancer.setCallback(this); + // 动态生成子类 + return enhancer.create(); + } + + @Override + public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws InvocationTargetException, IllegalAccessException { + System.out.println("权限校验"); + Object invoke = method.invoke(target, args); + System.out.println("资源回收"); + return invoke; + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/cglib/ZTest.java b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/cglib/ZTest.java new file mode 100644 index 0000000..1abb4a1 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/cglib/ZTest.java @@ -0,0 +1,9 @@ +package com.heibaiying.structural.proxy.cglib; + +public class ZTest { + public static void main(String[] args) { + Proxy proxy = new Proxy(new ComputeService()); + ComputeService service = (ComputeService) proxy.getProxyInstance(); + service.compute(); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/dynamic_proxy/ComputeService.java b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/dynamic_proxy/ComputeService.java new file mode 100644 index 0000000..4870fab --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/dynamic_proxy/ComputeService.java @@ -0,0 +1,8 @@ +package com.heibaiying.structural.proxy.dynamic_proxy; + +public class ComputeService implements IService { + @Override + public void compute() { + System.out.println("业务处理"); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/dynamic_proxy/IService.java b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/dynamic_proxy/IService.java new file mode 100644 index 0000000..eb24e56 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/dynamic_proxy/IService.java @@ -0,0 +1,5 @@ +package com.heibaiying.structural.proxy.dynamic_proxy; + +public interface IService { + void compute(); +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/dynamic_proxy/ZTest.java b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/dynamic_proxy/ZTest.java new file mode 100644 index 0000000..78b65ed --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/dynamic_proxy/ZTest.java @@ -0,0 +1,19 @@ +package com.heibaiying.structural.proxy.dynamic_proxy; + +import java.lang.reflect.Proxy; + +public class ZTest { + public static void main(String[] args) { + ComputeService target = new ComputeService(); + IService proxyInstance = (IService) Proxy.newProxyInstance( + target.getClass().getClassLoader(), + target.getClass().getInterfaces(), + (proxy, method, args1) -> { + System.out.println("权限校验"); + Object invoke = method.invoke(target, args1); + System.out.println("资源回收"); + return invoke; + }); + proxyInstance.compute(); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/static_proxy/ComputeService.java b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/static_proxy/ComputeService.java new file mode 100644 index 0000000..1775f27 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/static_proxy/ComputeService.java @@ -0,0 +1,8 @@ +package com.heibaiying.structural.proxy.static_proxy; + +public class ComputeService implements IService { + @Override + public void compute() { + System.out.println("业务处理"); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/static_proxy/IService.java b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/static_proxy/IService.java new file mode 100644 index 0000000..de8fc24 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/static_proxy/IService.java @@ -0,0 +1,5 @@ +package com.heibaiying.structural.proxy.static_proxy; + +public interface IService { + void compute(); +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/static_proxy/ProxyService.java b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/static_proxy/ProxyService.java new file mode 100644 index 0000000..7d9e31e --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/static_proxy/ProxyService.java @@ -0,0 +1,17 @@ +package com.heibaiying.structural.proxy.static_proxy; + +public class ProxyService implements IService { + + private IService target; + + public ProxyService(IService target) { + this.target = target; + } + + @Override + public void compute() { + System.out.println("权限校验"); + target.compute(); + System.out.println("资源回收"); + } +} diff --git a/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/static_proxy/ZTest.java b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/static_proxy/ZTest.java new file mode 100644 index 0000000..c671285 --- /dev/null +++ b/code/Java/design-pattern/src/main/java/com/heibaiying/structural/proxy/static_proxy/ZTest.java @@ -0,0 +1,8 @@ +package com.heibaiying.structural.proxy.static_proxy; + +public class ZTest { + public static void main(String[] args) { + ProxyService proxyService = new ProxyService(new ComputeService()); + proxyService.compute(); + } +} diff --git a/notes/Java_设计模式.md b/notes/Java_设计模式.md index c588cdb..a6aa54f 100644 --- a/notes/Java_设计模式.md +++ b/notes/Java_设计模式.md @@ -450,7 +450,7 @@ public class ZTest { ### 2.3 优缺点 -简单工厂的优点在于其向用户屏蔽了对象创建过程,使得用户可以不必关注具体的创建细节,其缺陷在于违背了开闭原则。在简单工厂模式下,如果想要增加新的产品,就需要修改简单工厂中的判断逻辑,这就违背了开闭原则,因此其并不属于 GOF 经典的 23 种设计模式。在 Java 语言中,可以通过泛型来尽量规避这一缺陷,此时需要将创建产品的方法修改为如下所示: +简单工厂的优点在于其向用户屏蔽了对象创建过程,使得用户可以不必关注具体的创建细节,其缺陷在于违背了开闭原则。在简单工厂模式中,如果想要增加新的产品,就需要修改简单工厂中的判断逻辑,这就违背了开闭原则,因此其并不属于 GOF 经典的 23 种设计模式。在 Java 语言中,可以通过泛型来尽量规避这一缺陷,此时可以将创建产品的方法修改为如下所示: ```java public Phone getPhone(Class phoneClass) { @@ -756,4 +756,15 @@ Phone(processor=高通骁龙处理器, camera=索尼摄像头, screen=OLED) ### 5.3 优点 -建造者模式的优点在于将复杂的构建过程拆分为多个独立的单元,在保证拓展性的基础上也保证了良好的封装性,使得客户端不必知道产品的具体创建流程。 \ No newline at end of file +建造者模式的优点在于将复杂的构建过程拆分为多个独立的单元,在保证拓展性的基础上也保证了良好的封装性,使得客户端不必知道产品的具体创建流程。 + +## 6. 原型模式 + +### 6.1 定义 + + + +### 6.2 示例 + +### 6.3 +