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