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();
}
}