From 688597599befbc43444085b860a0f59417d43148 Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 17 May 2019 15:22:52 +0800 Subject: [PATCH 01/30] Create simpleFactory.md --- .../simpleFactory.md" | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/simpleFactory.md" diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/simpleFactory.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/simpleFactory.md" new file mode 100644 index 0000000..bb54837 --- /dev/null +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/simpleFactory.md" @@ -0,0 +1,90 @@ +运算类(抽象类) +public abstract class Operation { + public double numberA; + public double numberB; + public abstract double result(); +} + +public class OperationAdd extends Operation { + + @Override + public double result() { + return numberA + numberB; + } +} + +public class OperationDiv extends Operation { + + @Override + public double result() { + if (numberB == 0) { + throw new RuntimeException("divided by 0"); + } + return numberA / numberB; + } +} + +public class OperationMul extends Operation { + + @Override + public double result() { + return numberA * numberB; + } +} + +public class OperationSub extends Operation { + + @Override + public double result() { + return numberA - numberB; + } +} + + + +/** + * 操作类工厂类 + * + */ +public class OperationFactory { + public static Operation createOperation(char operator) { + Operation operation = null; + + switch (operator) { + case '+': + operation = new OperationAdd(); + break; + case '-': + operation = new OperationSub(); + break; + case '*': + operation = new OperationMul(); + break; + case '/': + operation = new OperationDiv (); + break; + default: + throw new RuntimeException ("unsupported operation"); + } + + return operation; + } +} + + +/** + * 使用工厂方法生成实例完成运算操作 +*/ +public class Calculator { + public static void main (String[] args) { + Operation operation ; + char operator; + + operator = '+'; + operation = OperationFactory.createOperation (operator); + operation.numberA = 1.2; + operation.numberB = 2.3; + + System.out.println( operation.result() ); + } +} From e15429f5a8f1aeba8ade2e60e009373260e514b5 Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 17 May 2019 15:23:39 +0800 Subject: [PATCH 02/30] Update simpleFactory.md --- .../simpleFactory.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/simpleFactory.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/simpleFactory.md" index bb54837..8dc014c 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/simpleFactory.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/simpleFactory.md" @@ -1,3 +1,4 @@ +```java 运算类(抽象类) public abstract class Operation { public double numberA; @@ -88,3 +89,4 @@ public class Calculator { System.out.println( operation.result() ); } } +``` From 364801fc3f268e74553844fd182c250c3994e47a Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 17 May 2019 15:50:05 +0800 Subject: [PATCH 03/30] Create Strategy.md --- .../Strategy.md" | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Strategy.md" diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Strategy.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Strategy.md" new file mode 100644 index 0000000..04e6a49 --- /dev/null +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Strategy.md" @@ -0,0 +1,70 @@ +```java + +/** + * 策略接口 + * + */ +public interface Strategy { + public void algorithmInterface(); +} + +class ConcreteStrategyA implements Strategy { + + @Override + public void algorithmInterface() { + System.out.println("策略A的具体算法实现"); + } + +} + +class ConcreteStrategyB implements Strategy { + + @Override + public void algorithmInterface() { + System.out.println("策略B的具体算法实现"); + } + +} + +class ConcreteStrategyC implements Strategy { + + @Override + public void algorithmInterface() { + System.out.println("策略C的具体算法实现"); + } + +} + + + +public class Context { + Strategy strategy; + + public Context(Strategy strategy) { + this.strategy = strategy; + } + /* * 上下文接口 */ +public void contextInterface() { + strategy.algorithmInterface(); + } + +} + + +客户端使用策略 +public class StrategyClient { + public static void main(String[] args) { + Context context; + + context = new Context(new ConcreteStrategyA()); + context.contextInterface(); + + context = new Context(new ConcreteStrategyB()); + context.contextInterface(); + + context = new Context(new ConcreteStrategyC()); + context.contextInterface(); + + } +} +``` From b2da3ce77fea785bdf30ef5c8664d49a2a20c2c1 Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 17 May 2019 16:00:07 +0800 Subject: [PATCH 04/30] Create Decorative.md --- .../Decorative.md" | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Decorative.md" diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Decorative.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Decorative.md" new file mode 100644 index 0000000..a48ee34 --- /dev/null +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Decorative.md" @@ -0,0 +1,95 @@ +```java +/** + * Component是定义一个对象接口,可以给这些对象动态地添加职责 +*/ +public abstract class Component { + public abstract void operation(); +} + + +/** + * ConcreteComponent是定义一个具体的对象,也可以给这个对象添加一些职责 +*/ +public class ConcreteComponent extends Component { + + @Override + public void operation() { + System.out.println("具体对象的操作"); + } + +} + + +/**Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的*/ +public abstract class Decorator extends Component { + protected Component component; + + public Component getComponent() { + return component; + } + + public void setComponent(Component component) { + this.component = component; + } + + @Override + public void operation() { + if (component != null) { + component.operation(); + } + } + +} + +class ConcreteDecoratorA extends Decorator { + private String addedState; + + @Override + public void operation() { + // 首先运行原Component的operation(),再执行本类的功能,如addedState,相当于对原Component进行了装饰 + super.operation(); + addedState = "A中的new state "; + System.out.println(addedState + "具体装饰对象A的操作"); + } +} + +class ConcreteDecoratorB extends Decorator { + @Override + public void operation() { + super.operation(); + addedBehavior(); + System.out.println("具体装饰对象B的操作"); + } + + public void addedBehavior() { + System.out.print("B中的新增行为 "); + } +} + +class ConcreteDecoratorC extends Decorator { + @Override + public void operation() { + super.operation(); + System.out.println("C没有特殊行为 " + "具体装饰对象C的操作"); + } + +} + + +/**装饰模式客户端调用代码,装饰的过程更像是层层包装,用前面的对象装饰后面的对象 + */ +public class DecoratorClient { + public static void main(String[] args) { + ConcreteComponent concreteComponent = new ConcreteComponent(); + ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA(); + ConcreteDecoratorB concreteDecoratorB = new ConcreteDecoratorB(); + ConcreteDecoratorC concreteDecoratorC = new ConcreteDecoratorC(); + + concreteDecoratorA.setComponent(concreteComponent); + concreteDecoratorB.setComponent(concreteDecoratorA); + concreteDecoratorC.setComponent(concreteDecoratorB); + concreteDecoratorC.operation(); + + } +} +``` From f40e11164075dc7dd0176a153fcca5f519a1bb69 Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 17 May 2019 16:07:46 +0800 Subject: [PATCH 05/30] Create readme.md --- .../readme.md" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" new file mode 100644 index 0000000..8323d1a --- /dev/null +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" @@ -0,0 +1 @@ +### 《大话设计模式》这本书是用C#语言写的,不易于Java学习者的快速理解,所以在GitHub上Fock了liu yuning大神的Java代码,希望在二位牛人工作的基础上进行整理能使自己更好的理解! From 97eae5a8eacd9c5b4738c0a08bb3dd2b3d80772a Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 17 May 2019 16:10:13 +0800 Subject: [PATCH 06/30] Update readme.md --- .../readme.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" index 8323d1a..c2faca4 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" @@ -1 +1 @@ -### 《大话设计模式》这本书是用C#语言写的,不易于Java学习者的快速理解,所以在GitHub上Fock了liu yuning大神的Java代码,希望在二位牛人工作的基础上进行整理能使自己更好的理解! +###### 程杰的《大话设计模式》是用C#语言写的,不易于Java学习者的快速入门,所以在GitHub上Fock了liu yuning大神的Java代码,希望能通过对二位牛人的工作进行整理,使自己更好的理解! From 5e72f4509528bf4a8adc74d58c15fe27c311609b Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 17 May 2019 16:58:48 +0800 Subject: [PATCH 07/30] Update Decorative.md --- .../Decorative.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Decorative.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Decorative.md" index a48ee34..7a6fe49 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Decorative.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Decorative.md" @@ -81,7 +81,7 @@ class ConcreteDecoratorC extends Decorator { public class DecoratorClient { public static void main(String[] args) { ConcreteComponent concreteComponent = new ConcreteComponent(); - ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA(); + ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA();//深入理解(引用了抽象父类的方法) ConcreteDecoratorB concreteDecoratorB = new ConcreteDecoratorB(); ConcreteDecoratorC concreteDecoratorC = new ConcreteDecoratorC(); From 9cf17242c72d36f05a781462f49e14026c4ff4b0 Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 17 May 2019 17:03:44 +0800 Subject: [PATCH 08/30] Create Proxy.md --- .../Proxy.md" | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Proxy.md" diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Proxy.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Proxy.md" new file mode 100644 index 0000000..7b42f9f --- /dev/null +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Proxy.md" @@ -0,0 +1,41 @@ +```java +/** 定义真实实体类与代理类共用的接口*/ +public interface Subject { + public void request(); +} + +/** 真实实体类*/ +public class RealSubject implements Subject { + + @Override + public void request() { + System.out.println("真实对象的请求"); + } + +} + +/** 代理类*/ +public class Proxy implements Subject { + + // 保存一个引用,使得代理可以访问真实实体 + Subject subject; + + public Proxy() { + subject = new RealSubject(); + } + + @Override + public void request() { + subject.request(); + } + +} + +/**代理客户端*/ +public class ProxyClient { + public static void main(String[] args) { + Proxy proxy = new Proxy(); + proxy.request(); + } +} +``` From e2e74219d0ec9e02822f9ea7b376d2adbc70020c Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 24 May 2019 19:43:10 +0800 Subject: [PATCH 09/30] Update readme.md --- .../readme.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" index c2faca4..9e027eb 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" @@ -1 +1 @@ -###### 程杰的《大话设计模式》是用C#语言写的,不易于Java学习者的快速入门,所以在GitHub上Fock了liu yuning大神的Java代码,希望能通过对二位牛人的工作进行整理,使自己更好的理解! +####程杰的《大话设计模式》是用C#语言写的,不易于Java学习者的快速入门,所以在GitHub上Fock了liu yuning大神的Java代码,希望能通过对二位牛人的工作进行整理,使自己更好的理解! From b937538850a8cfc3fc9fb05ec1615fb942582e0b Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 24 May 2019 19:43:26 +0800 Subject: [PATCH 10/30] Update readme.md --- .../readme.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" index 9e027eb..457ee79 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" @@ -1 +1 @@ -####程杰的《大话设计模式》是用C#语言写的,不易于Java学习者的快速入门,所以在GitHub上Fock了liu yuning大神的Java代码,希望能通过对二位牛人的工作进行整理,使自己更好的理解! +#### 程杰的《大话设计模式》是用C#语言写的,不易于Java学习者的快速入门,所以在GitHub上Fock了liu yuning大神的Java代码,希望能通过对二位牛人的工作进行整理,使自己更好的理解! From 38a5b67a391f7e7fbb15562106735bd531241778 Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 24 May 2019 19:44:20 +0800 Subject: [PATCH 11/30] Update readme.md --- .../readme.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" index 457ee79..3d5cd05 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" @@ -1 +1 @@ -#### 程杰的《大话设计模式》是用C#语言写的,不易于Java学习者的快速入门,所以在GitHub上Fock了liu yuning大神的Java代码,希望能通过对二位牛人的工作进行整理,使自己更好的理解! +#### 程杰的《大话设计模式》是用C#语言写的,不易于Java学习者的快速入门,所以在GitHub上Fork了liu yuning大神的Java代码,希望能通过对二位牛人的工作进行整理,使自己更好的理解! From 1585b0e571bc8a7682a5d779b82d1a6eb4d58f8f Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 24 May 2019 19:44:41 +0800 Subject: [PATCH 12/30] Update readme.md --- .../readme.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" index 3d5cd05..1246f2e 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" @@ -1 +1 @@ -#### 程杰的《大话设计模式》是用C#语言写的,不易于Java学习者的快速入门,所以在GitHub上Fork了liu yuning大神的Java代码,希望能通过对二位牛人的工作进行整理,使自己更好的理解! +##### 程杰的《大话设计模式》是用C#语言写的,不易于Java学习者的快速入门,所以在GitHub上Fork了liu yuning大神的Java代码,希望能通过对二位牛人的工作进行整理,使自己更好的理解! From 8d114f35655ab5d5d13395709ae374ccaa945fea Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 24 May 2019 19:45:27 +0800 Subject: [PATCH 13/30] Update readme.md From 497d6d665a9cda4be519886ffe34daf7eae172a4 Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 24 May 2019 19:49:44 +0800 Subject: [PATCH 14/30] Create Some principles.md --- .../Some principles.md" | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" new file mode 100644 index 0000000..39583a8 --- /dev/null +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" @@ -0,0 +1,2 @@ +# 单一职责原则 +就一个类而言,应该仅有一个它的变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致 From b01679d825af98c77d1c743cd81888c443ac6ce2 Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 24 May 2019 19:52:32 +0800 Subject: [PATCH 15/30] Update Some principles.md --- .../Some principles.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" index 39583a8..f637509 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" @@ -1,2 +1,3 @@ # 单一职责原则 -就一个类而言,应该仅有一个它的变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致 + 就一个类而言,应该仅有一个它的变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。 + 软件设计真正要做的许多内容,就是发现职责并把这些职责相互分离。如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责。 From 41abdcc5c1746fcf9a59c525fde797c961c2af98 Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 24 May 2019 20:21:24 +0800 Subject: [PATCH 16/30] Update Some principles.md --- .../Some principles.md" | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" index f637509..641ba64 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" @@ -1,3 +1,14 @@ # 单一职责原则 - 就一个类而言,应该仅有一个它的变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。 - 软件设计真正要做的许多内容,就是发现职责并把这些职责相互分离。如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责。 +单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。
+如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。
+软件设计真正要做的许多内容,就是发现职责并把这些职责相互分离。如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责。 +# 开放-封闭原则 +开放-封闭原则:软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。
+这个原则有两大特征:对于扩展是开放的,对于更改是封闭的。
+怎样的设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出新的版本呢? +无论模块是多么的“封闭”,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化做出些选择,他必须先猜测出最有可能发生的变化种类,然后构造对象来隔离那些变化。
+对于难以预料的变化,等到变化发生时立即采取行动。
+在我们最初编写代码时,假设变化不会发生。当变化发生时,我们就创建抽象来隔离以后发生的同类变化。 +面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。 +我们希望的是在开发工作展开不久就知道可能发生的变化,查明可能发生的变化所等待的时间越长,要创建正确的抽象就越困难。
+开放-封闭原则是面向对象设计思想的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开放人员应该仅对程序中的呈现出的那些部分做出抽象,然而对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。 From 85d9c06f8548e1146033db7eec66e80256df06ce Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 24 May 2019 20:46:46 +0800 Subject: [PATCH 17/30] Update Some principles.md --- .../Some principles.md" | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" index 641ba64..4955247 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" @@ -12,3 +12,14 @@ 面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。 我们希望的是在开发工作展开不久就知道可能发生的变化,查明可能发生的变化所等待的时间越长,要创建正确的抽象就越困难。
开放-封闭原则是面向对象设计思想的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开放人员应该仅对程序中的呈现出的那些部分做出抽象,然而对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。 + +# 依赖倒转原则 +依赖倒转原则:A高层模块不应该依赖低层模块。两个都应该依赖抽象。B 抽象不应该依赖细节。细节应该依赖抽象。
+如果不管高层模块还是低层模块,它们都依赖于抽象,具体一点就是接口或抽象类,只要接口是稳定的,那么任何一个更改都不用担心其他受到影响,这就是无论高层还是低层模块都可以很容易的被复用,这才是最好的办法。 +# 里氏代换原则 +里氏代换原则:子类型必须能够替换掉它们的父类型。 +一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化。
+只有当子类可以替换掉父类,软件单元的功能不受影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。
+由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展。
+依赖倒转原则其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计了。 + From 1ea6c9f03dc8d20be70342ec4c0616ca1fb2974b Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Fri, 24 May 2019 21:08:03 +0800 Subject: [PATCH 18/30] Update Decorative.md --- .../Decorative.md" | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Decorative.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Decorative.md" index 7a6fe49..d1c6885 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Decorative.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Decorative.md" @@ -1,3 +1,7 @@ +# 装饰模式 +装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
+装饰模式是为已有功能动态地添加更多功能的一种方式。当系统需要新功能的时候,是向旧有的类添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为。在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定的情况下才会执行的特殊行为的需要。而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了。 +装饰模式的优点,是把类中的装饰功能从类中搬移去除,这样可以简化原有的类。这样做最大的好处就是有效的把类的职责和装饰功能区分开了。而且可以去除相关中重复的装饰逻辑。 ```java /** * Component是定义一个对象接口,可以给这些对象动态地添加职责 @@ -40,7 +44,7 @@ public abstract class Decorator extends Component { } } - +/*至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能*/ class ConcreteDecoratorA extends Decorator { private String addedState; From ad7bbd79774ba6b41a63efa54071eaec47d64748 Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Thu, 30 May 2019 14:45:55 +0800 Subject: [PATCH 19/30] Create Observer.md --- .../Observer.md" | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Observer.md" diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Observer.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Observer.md" new file mode 100644 index 0000000..220a36b --- /dev/null +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Observer.md" @@ -0,0 +1,62 @@ +```java +/** + * 抽象观察者 + * + * @author liu yuning + * + */ +public abstract class Observer { + + public abstract void update(); +} + + + + + +import java.util.ArrayList; +import java.util.List; + +/** + * 主题或抽象通知者 + * + * @author liu yuning + * + */ +public abstract class Subject { + private List observers = new ArrayList(); + + public void attach(Observer observer) { + observers.add(observer); + } + + public void detach(Observer observer) { + observers.remove(observer); + } + + public void notifyObserver() { + for (Observer observer : observers) { + observer.update(); + } + } +} + + + +/** + * 具体主题或通知者 + * + * @author liu yuning + * + */ +public class ConcreteSubject extends Subject { + private String subjectState; + + public String getSubjectState() { + return subjectState; + } + + public void setSubjectState(String subjectState) { + this.subjectState = subjectState; + } +} From d9b89db608ff23adccdc418d251a9a109eef0b2f Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Thu, 30 May 2019 14:48:47 +0800 Subject: [PATCH 20/30] Update Observer.md --- .../Observer.md" | 79 ++++++++++++++++--- 1 file changed, 70 insertions(+), 9 deletions(-) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Observer.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Observer.md" index 220a36b..192be3d 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Observer.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Observer.md" @@ -1,9 +1,6 @@ ```java /** * 抽象观察者 - * - * @author liu yuning - * */ public abstract class Observer { @@ -19,9 +16,6 @@ import java.util.List; /** * 主题或抽象通知者 - * - * @author liu yuning - * */ public abstract class Subject { private List observers = new ArrayList(); @@ -45,9 +39,6 @@ public abstract class Subject { /** * 具体主题或通知者 - * - * @author liu yuning - * */ public class ConcreteSubject extends Subject { private String subjectState; @@ -60,3 +51,73 @@ public class ConcreteSubject extends Subject { this.subjectState = subjectState; } } + + +/** + * 具体观察者 + */ +public class ConcreteObserver extends Observer { + + private String name; + private String observerState; + private ConcreteSubject concreteSubject; + + public ConcreteObserver(ConcreteSubject concreteSubject, String name) { + this.setName(name); + this.setConcreteSubject(concreteSubject); + } + + @Override + public void update() { + this.setObserverState(concreteSubject.getSubjectState()); + System.out.println("观察者" + this.getName() + "的新状态是" + + this.getObserverState()); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getObserverState() { + return observerState; + } + + public void setObserverState(String observerState) { + this.observerState = observerState; + } + + public ConcreteSubject getConcreteSubject() { + return concreteSubject; + } + + public void setConcreteSubject(ConcreteSubject concreteSubject) { + this.concreteSubject = concreteSubject; + } + +} + + + + +/** + * 观察者模式客户端代码 + */ +public class ObserverClient { + public static void main(String[] args) { + ConcreteSubject concreteSubject = new ConcreteSubject(); + + concreteSubject.attach(new ConcreteObserver(concreteSubject, "X")); + concreteSubject.attach(new ConcreteObserver(concreteSubject, "Y")); + concreteSubject.attach(new ConcreteObserver(concreteSubject, "Z")); + + concreteSubject.setSubjectState("ABC"); + concreteSubject.notifyObserver(); + + } + +} +``` From a65ec41655b7587dd9d977c87e5530e4d2caf1f7 Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Thu, 30 May 2019 15:05:56 +0800 Subject: [PATCH 21/30] Update Observer.md --- .../Observer.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Observer.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Observer.md" index 192be3d..d935d4c 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Observer.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Observer.md" @@ -1,3 +1,4 @@ +观察者模式 ```java /** * 抽象观察者 From 31f69e3708860b08b25f341804e937df87ef29ab Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Thu, 30 May 2019 15:18:21 +0800 Subject: [PATCH 22/30] Create builder.md --- .../builder.md" | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/builder.md" diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/builder.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/builder.md" new file mode 100644 index 0000000..68810cd --- /dev/null +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/builder.md" @@ -0,0 +1,117 @@ +```java +public abstract class Builder { + public abstract void buildPartA(); + + public abstract void buildPartB(); + + public abstract Product getBuildResult(); +} + + +public class Product { + List parts = new ArrayList(); + + // 添加产品部件 + public void add(String part) { + parts.add(part); + } + + // 列举所有的产品部件 + public void show() { + System.out.println("---产品 创建---"); + + for (String part : parts) { + System.out.println(part); + } + } +} + + +/** + * 具体建造者类 + * + */ +public class ConcreteBuilder1 extends Builder { + + private Product product = new Product(); + + @Override + public void buildPartA() { + product.add("部件A"); + } + + @Override + public void buildPartB() { + product.add("部件B"); + } + + @Override + public Product getBuildResult() { + return product; + } + +} + + + +/** + * 具体建造者类,建造的对象时Product,通过build使Product完善 + * + */ +public class ConcreteBuilder2 extends Builder { + + private Product product = new Product(); + + @Override + public void buildPartA() { + product.add("部件X"); + } + + @Override + public void buildPartB() { + product.add("部件Y"); + } + + @Override + public Product getBuildResult() { + return product; + } + +} + + +/** + * 指挥者类,用来指挥建造过程 + */ +public class Director { + + public void construct(Builder builder) { + builder.buildPartA(); + builder.buildPartB(); + } +} + + +/** + * 建造客户端 + * + */ +public class BuilderClient { + + public static void main(String[] args) { + Director director = new Director(); + Builder builder1 = new ConcreteBuilder1(); + Builder builder2 = new ConcreteBuilder2(); + + director.construct(builder1); + Product product1 = builder1.getBuildResult(); + product1.show(); + + director.construct(builder2); + Product product2 = builder2.getBuildResult(); + product2.show(); + + } + +} +``` From 385feab017b1263a3e758ff18ff64ed4fac27bea Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Thu, 30 May 2019 16:00:08 +0800 Subject: [PATCH 23/30] Update builder.md --- .../builder.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/builder.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/builder.md" index 68810cd..2d18cf3 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/builder.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/builder.md" @@ -1,3 +1,4 @@ +建造者模式 ```java public abstract class Builder { public abstract void buildPartA(); From ada6efe1821796c84851693073d02f2ac4f0146d Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Thu, 30 May 2019 16:05:36 +0800 Subject: [PATCH 24/30] Create Template.md --- .../Template.md" | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Template.md" diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Template.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Template.md" new file mode 100644 index 0000000..97023e3 --- /dev/null +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Template.md" @@ -0,0 +1,71 @@ +模板方法模式 +···java +/** + * 模板方法抽象类:不变的部分给出具体实现,变化的部分封装为抽象方法延迟到子类实现 + */ +public abstract class AbstractTemplate { + public abstract void primitiveOperation1(); + + public abstract void primitiveOperation2(); + + public void templateMethod() { + primitiveOperation1(); + primitiveOperation2(); + System.out.println("模板方法结束\n"); + } + +} + + +/** + * 具体类A + * + */ +public class ConcreteClassA extends AbstractTemplate { + + @Override + public void primitiveOperation1() { + System.out.println("具体类A的方法1实现"); + } + + @Override + public void primitiveOperation2() { + System.out.println("具体类A的方法2实现"); + } + +} + +/** + * 具体类B + * + */ +public class ConcreteClassB extends AbstractTemplate { + + @Override + public void primitiveOperation1() { + System.out.println("具体类B的方法1实现"); + } + + @Override + public void primitiveOperation2() { + System.out.println("具体类B的方法2实现"); + } + +} + +/** + * 模板方法客户端 + * + */ +public class TemplateClient { + public static void main(String[] args) { + AbstractTemplate abstractTemplate; + + abstractTemplate = new ConcreteClassA(); + abstractTemplate.templateMethod(); + + abstractTemplate = new ConcreteClassB(); + abstractTemplate.templateMethod(); + + } +} From ef34f17448441530dfe0ad6a9dc136c6e83642cf Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Thu, 30 May 2019 16:06:32 +0800 Subject: [PATCH 25/30] Update Template.md --- .../Template.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Template.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Template.md" index 97023e3..0bb4c34 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Template.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Template.md" @@ -1,5 +1,5 @@ 模板方法模式 -···java +```java /** * 模板方法抽象类:不变的部分给出具体实现,变化的部分封装为抽象方法延迟到子类实现 */ @@ -69,3 +69,4 @@ public class TemplateClient { } } +``` From b71911716fea059c84d974410054f0db430e56e3 Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Thu, 30 May 2019 16:22:53 +0800 Subject: [PATCH 26/30] =?UTF-8?q?Update=20and=20rename=20Template.md=20to?= =?UTF-8?q?=20Template(=E6=A8=A1=E6=9D=BF=E6=96=B9=E6=B3=95=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F).md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\277\346\226\271\346\263\225\346\250\241\345\274\217).md" | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) rename "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Template.md" => "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Template(\346\250\241\346\235\277\346\226\271\346\263\225\346\250\241\345\274\217).md" (67%) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Template.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Template(\346\250\241\346\235\277\346\226\271\346\263\225\346\250\241\345\274\217).md" similarity index 67% rename from "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Template.md" rename to "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Template(\346\250\241\346\235\277\346\226\271\346\263\225\346\250\241\345\274\217).md" index 0bb4c34..a8934c8 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Template.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Template(\346\250\241\346\235\277\346\226\271\346\263\225\346\250\241\345\274\217).md" @@ -1,4 +1,7 @@ -模板方法模式 +# 模板方法模式 + 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
+ 特点:模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。模板方法就是提供了一个很好的代码复用平台。
+ 当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。通过模板方法把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。 ```java /** * 模板方法抽象类:不变的部分给出具体实现,变化的部分封装为抽象方法延迟到子类实现 From b2e20e426fc8e147539533d138291142a7b4f75e Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Thu, 30 May 2019 16:55:49 +0800 Subject: [PATCH 27/30] Update Some principles.md --- .../Some principles.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" index 4955247..08d4df7 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Some principles.md" @@ -23,3 +23,7 @@ 由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展。
依赖倒转原则其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计了。 +# 迪米特法则 +如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
+在类的结构设计上,每一个类都应当尽量降低成员的访问权限。
+迪米特法则其根本思想,是强调了类之间的松耦合。类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。 From 41700361da2f5da48d40f4c46469fc4394406eb5 Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Thu, 30 May 2019 17:11:55 +0800 Subject: [PATCH 28/30] =?UTF-8?q?Update=20and=20rename=20simpleFactory.md?= =?UTF-8?q?=20to=20simpleFactory(=E7=AE=80=E5=8D=95=E5=B7=A5=E5=8E=82?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F).md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...215\225\345\267\245\345\216\202\346\250\241\345\274\217).md" | 2 ++ 1 file changed, 2 insertions(+) rename "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/simpleFactory.md" => "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/simpleFactory(\347\256\200\345\215\225\345\267\245\345\216\202\346\250\241\345\274\217).md" (89%) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/simpleFactory.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/simpleFactory(\347\256\200\345\215\225\345\267\245\345\216\202\346\250\241\345\274\217).md" similarity index 89% rename from "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/simpleFactory.md" rename to "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/simpleFactory(\347\256\200\345\215\225\345\267\245\345\216\202\346\250\241\345\274\217).md" index 8dc014c..b1d9298 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/simpleFactory.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/simpleFactory(\347\256\200\345\215\225\345\267\245\345\216\202\346\250\241\345\274\217).md" @@ -1,3 +1,5 @@ +# 简单工厂模式 +面向对象的好处:通过封装、继承、多态把程序的耦合度降低,用设计模式使得程序更加的灵活,容易修改,并且易于复用。 ```java 运算类(抽象类) public abstract class Operation { From d494e243c84705767b583f8deef22976d2439e77 Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Thu, 30 May 2019 17:14:51 +0800 Subject: [PATCH 29/30] Update readme.md --- .../readme.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" index 1246f2e..59db636 100644 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/readme.md" @@ -1 +1,2 @@ ##### 程杰的《大话设计模式》是用C#语言写的,不易于Java学习者的快速入门,所以在GitHub上Fork了liu yuning大神的Java代码,希望能通过对二位牛人的工作进行整理,使自己更好的理解! +编程是一门技术,更是一门艺术,不能只满足于写完代码运行结果正确就完事,时常考虑如何让代码更加简炼,更加容易维护,容易扩展和复用,只有这样才可以真正得到提高。 From f0ace0d95e0742001ed8e878b2fa77db5774111a Mon Sep 17 00:00:00 2001 From: wangxuanju Date: Thu, 30 May 2019 18:03:05 +0800 Subject: [PATCH 30/30] =?UTF-8?q?Update=20and=20rename=20Strategy.md=20to?= =?UTF-8?q?=20Strategy=EF=BC=88=E7=AD=96=E7=95=A5=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=EF=BC=89.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Strategy.md" | 70 ---------------- ...45\346\250\241\345\274\217\357\274\211.md" | 79 +++++++++++++++++++ 2 files changed, 79 insertions(+), 70 deletions(-) delete mode 100644 "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Strategy.md" create mode 100644 "\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Strategy\357\274\210\347\255\226\347\225\245\346\250\241\345\274\217\357\274\211.md" diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Strategy.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Strategy.md" deleted file mode 100644 index 04e6a49..0000000 --- "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Strategy.md" +++ /dev/null @@ -1,70 +0,0 @@ -```java - -/** - * 策略接口 - * - */ -public interface Strategy { - public void algorithmInterface(); -} - -class ConcreteStrategyA implements Strategy { - - @Override - public void algorithmInterface() { - System.out.println("策略A的具体算法实现"); - } - -} - -class ConcreteStrategyB implements Strategy { - - @Override - public void algorithmInterface() { - System.out.println("策略B的具体算法实现"); - } - -} - -class ConcreteStrategyC implements Strategy { - - @Override - public void algorithmInterface() { - System.out.println("策略C的具体算法实现"); - } - -} - - - -public class Context { - Strategy strategy; - - public Context(Strategy strategy) { - this.strategy = strategy; - } - /* * 上下文接口 */ -public void contextInterface() { - strategy.algorithmInterface(); - } - -} - - -客户端使用策略 -public class StrategyClient { - public static void main(String[] args) { - Context context; - - context = new Context(new ConcreteStrategyA()); - context.contextInterface(); - - context = new Context(new ConcreteStrategyB()); - context.contextInterface(); - - context = new Context(new ConcreteStrategyC()); - context.contextInterface(); - - } -} -``` diff --git "a/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Strategy\357\274\210\347\255\226\347\225\245\346\250\241\345\274\217\357\274\211.md" "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Strategy\357\274\210\347\255\226\347\225\245\346\250\241\345\274\217\357\274\211.md" new file mode 100644 index 0000000..acab66c --- /dev/null +++ "b/\345\244\247\350\257\235\350\256\276\350\256\241\346\250\241\345\274\217\357\274\210Java\357\274\211/Strategy\357\274\210\347\255\226\347\225\245\346\250\241\345\274\217\357\274\211.md" @@ -0,0 +1,79 @@ +# 策略模式 +定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
+策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的方法,只是实现不同,它可以以相同的方法调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
+策略模式的Strategy类层次为Context定义了一系列可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。
+策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
+当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择适合的行为。将这些行为封装在一个个独立的Strategy类中,可以在使用这些行为的类中消除条件语句。
+策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
+在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。 + +```java + +/** + * 策略接口 + * + */ +public interface Strategy { + public void algorithmInterface(); +} + +class ConcreteStrategyA implements Strategy { + + @Override + public void algorithmInterface() { + System.out.println("策略A的具体算法实现"); + } + +} + +class ConcreteStrategyB implements Strategy { + + @Override + public void algorithmInterface() { + System.out.println("策略B的具体算法实现"); + } + +} + +class ConcreteStrategyC implements Strategy { + + @Override + public void algorithmInterface() { + System.out.println("策略C的具体算法实现"); + } + +} + + + +public class Context { + Strategy strategy; + + public Context(Strategy strategy) { + this.strategy = strategy; + } + /* * 上下文接口 */ +public void contextInterface() { + strategy.algorithmInterface(); + } + +} + + +客户端使用策略 +public class StrategyClient { + public static void main(String[] args) { + Context context; + + context = new Context(new ConcreteStrategyA()); + context.contextInterface(); + + context = new Context(new ConcreteStrategyB()); + context.contextInterface(); + + context = new Context(new ConcreteStrategyC()); + context.contextInterface(); + + } +} +```