From afb1c61f771a469ef869ca12d67258d39a8740a9 Mon Sep 17 00:00:00 2001 From: soxhwhat <1246669436@qq.com> Date: Thu, 29 Jun 2023 14:58:25 +0800 Subject: [PATCH 1/4] =?UTF-8?q?doc:=20=E6=A1=A5=E6=8E=A5=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E7=9A=84=E5=AD=A6=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 合成/聚合复用原则(CARP),尽量使用合成/聚合,尽量不要使用类继承。[J&DP] 由于实现的方式有多种,桥接模式的核心意图就是把这些实现独立出来,让它们各自地变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。 --- src/designpattern/bridge/Abstraction.java | 9 +++++++++ src/designpattern/bridge/BridgeClient.java | 2 +- src/designpattern/bridge/Implementor.java | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/designpattern/bridge/Abstraction.java b/src/designpattern/bridge/Abstraction.java index a180a7c..1366948 100644 --- a/src/designpattern/bridge/Abstraction.java +++ b/src/designpattern/bridge/Abstraction.java @@ -4,6 +4,8 @@ * * @author liu yuning * + * 有一个聚合线,哈,像一座桥。 + * 由于实现的方式有多种,桥接模式的核心意图就是把这些实现独立出来,让它们各自地变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。 */ public abstract class Abstraction { protected Implementor implementor;// 桥接模式的关键,使得Abstraction聚合Implementor @@ -13,6 +15,10 @@ public Abstraction(String name) { this.setName(name); } + /** + * 品牌需要关注软件,所以可在机器中安装软件,以备运行。 + * @param implementor + */ public void setImplementor(Implementor implementor) { this.implementor = implementor; } @@ -31,6 +37,9 @@ public void setName(String name) { } } +/** + * 可以看作是不同的品牌 + */ class AbstractionA extends Abstraction { public AbstractionA(String name) { diff --git a/src/designpattern/bridge/BridgeClient.java b/src/designpattern/bridge/BridgeClient.java index 0c676f5..d9810a2 100644 --- a/src/designpattern/bridge/BridgeClient.java +++ b/src/designpattern/bridge/BridgeClient.java @@ -2,7 +2,7 @@ /** * 客户端 - * + * 我的理解就是实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。 * @author liu yuning * */ diff --git a/src/designpattern/bridge/Implementor.java b/src/designpattern/bridge/Implementor.java index b5592b5..203d1fb 100644 --- a/src/designpattern/bridge/Implementor.java +++ b/src/designpattern/bridge/Implementor.java @@ -4,6 +4,8 @@ * * @author liu yuning * + * 可以看作是手机软件 + * */ public abstract class Implementor { From 521e1ad32a1ce7cc0563500c673de663882bb5ca Mon Sep 17 00:00:00 2001 From: soxhwhat <1246669436@qq.com> Date: Thu, 29 Jun 2023 15:33:41 +0800 Subject: [PATCH 2/4] =?UTF-8?q?docs:=20=E7=AE=80=E5=8D=95=E5=B7=A5?= =?UTF-8?q?=E5=8E=82=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.松耦合性--使用继承和多态 2.到底要实例化谁,将来会不会增加实例化的对象,比如增加开根运算,这是很容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂。 --- src/designpattern/factory/simple/OperationFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/designpattern/factory/simple/OperationFactory.java b/src/designpattern/factory/simple/OperationFactory.java index 76aa9dc..e2cc1d0 100644 --- a/src/designpattern/factory/simple/OperationFactory.java +++ b/src/designpattern/factory/simple/OperationFactory.java @@ -2,7 +2,7 @@ /** * 操作类工厂类 - * + * 到底要实例化谁,将来会不会增加实例化的对象,比如增加开根运算,这是很容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂,来, * @author liu yuning * */ From f69b53cc44a69046935b0d8d07dcfe6fb1c8392b Mon Sep 17 00:00:00 2001 From: soxhwhat <1246669436@qq.com> Date: Mon, 3 Jul 2023 11:49:58 +0800 Subject: [PATCH 3/4] =?UTF-8?q?docs:=20=E5=B7=A5=E5=8E=82=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.克服简单工程模式破坏开闭原则的缺点 2.通过实现抽象接口、多态等特性实现够工厂模式 --- .idea/inspectionProfiles/Project_Default.xml | 68 +++++++++++++++++++ .idea/misc.xml | 6 ++ .idea/modules.xml | 8 +++ .idea/vcs.xml | 6 ++ JavaCodeAcc.iml | 11 +++ .../factory/method/FactoryClient.java | 4 +- .../factory/method/IFactory.java | 4 +- 7 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 JavaCodeAcc.iml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..ee9f695 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,68 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..8977715 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..11531af --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/JavaCodeAcc.iml b/JavaCodeAcc.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/JavaCodeAcc.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/designpattern/factory/method/FactoryClient.java b/src/designpattern/factory/method/FactoryClient.java index 6e833d7..b456162 100644 --- a/src/designpattern/factory/method/FactoryClient.java +++ b/src/designpattern/factory/method/FactoryClient.java @@ -4,7 +4,9 @@ /** * 工厂方法客户端 - * + * + * + * 由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。但缺点是由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。 * @author liu yuning * */ diff --git a/src/designpattern/factory/method/IFactory.java b/src/designpattern/factory/method/IFactory.java index d70ae69..4bdef68 100644 --- a/src/designpattern/factory/method/IFactory.java +++ b/src/designpattern/factory/method/IFactory.java @@ -8,7 +8,9 @@ /** * 工厂接口 - * + * + * 简单工厂模式:简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖 + * 但是违反了开闭原则,如果需要增加新的功能,必须修改工厂类,这样就会造成工厂逻辑过于复杂。 * @author liu yuning * */ From ce998fe89c889dfaa93fc31094613ec9970aee11 Mon Sep 17 00:00:00 2001 From: soxhwhat <1246669436@qq.com> Date: Wed, 12 Jul 2023 14:42:07 +0800 Subject: [PATCH 4/4] =?UTF-8?q?docs:=20=E7=AD=96=E7=95=A5=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原则: 对既有的代码影响最小的方式来修改软件,可以节省时间去让程序做更酷的时间。 设计原则: 1. 找出应用中可能需要变化之处,把它们独立出来,不要和一成不变的东西混在一起。(几乎是所有设计模式背后的精神所在) 2. 针对接口编程(针对超类型,可以是抽象类或者是接口),而不是针对实现编程。比方说,我们想要产生一个新的绿头鸭实例, 并指定特定"类型"的飞行行为给它。干脆顺便让鸭子的行为可以动态地改变好了。换句话说,我们应该在鸭子类中包含设定行为的方法,这样就可以在"运行时"动态地"改变"绿头鸭的飞行行为。 鸭子的子类将使用接口表示行为,所以实际的行为不会被绑定在鸭子的子类中。(换句话说,特定的具体行为编写在具体的实现类中) 3. 多用组合,少用继承。 1. 当涉及到维护时,为了复用目的而使用继承,结局并不完美。 2. 利用接口实现行为,会导致重复代码(实现借口)激增 --- src/designpattern/strategy/Context.java | 16 ++++++++++++++++ src/designpattern/strategy/Strategy.java | 3 +++ src/designpattern/strategy/StrategyClient.java | 4 ++++ 3 files changed, 23 insertions(+) diff --git a/src/designpattern/strategy/Context.java b/src/designpattern/strategy/Context.java index f595c4e..2e4b57f 100644 --- a/src/designpattern/strategy/Context.java +++ b/src/designpattern/strategy/Context.java @@ -7,14 +7,30 @@ * */ public class Context { + + /** + * 去除掉原本的方法,采用实例变量的方式声明一个Strategy接口 + * 每个Context对象会动态地设置这些变量以在运行时引用正确的行为类型。 + */ Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } + /** + * 动态设置策略 + * + * @param strategy + */ + public void setStrategy(Strategy strategy) { + this.strategy = strategy; + } + /** * 上下文接口 + * + * Context对象本身不处理算法,而是把这些工作委托给了Strategy接口。 */ public void contextInterface() { strategy.algorithmInterface(); diff --git a/src/designpattern/strategy/Strategy.java b/src/designpattern/strategy/Strategy.java index 372b99b..40b2166 100644 --- a/src/designpattern/strategy/Strategy.java +++ b/src/designpattern/strategy/Strategy.java @@ -10,6 +10,9 @@ public interface Strategy { public void algorithmInterface(); } +/** + * 将每组行为想象成一个算法族,分别封装起来,让它们之间可以互相替换。 + */ class ConcreteStrategyA implements Strategy { @Override diff --git a/src/designpattern/strategy/StrategyClient.java b/src/designpattern/strategy/StrategyClient.java index acb7189..bc4bb6b 100644 --- a/src/designpattern/strategy/StrategyClient.java +++ b/src/designpattern/strategy/StrategyClient.java @@ -18,6 +18,10 @@ public static void main(String[] args) { context = new Context(new ConcreteStrategyC()); context.contextInterface(); + // 动态改变策略 + // 在运行时想改变鸭子的行为,只需调用鸭子的setter方法就可以。 + context.setStrategy(new ConcreteStrategyA()); + context.contextInterface(); } }