Skip to content

Commit 27ae061

Browse files
authored
Merge pull request lingcoder#279 from X-ljy/master
构建应用程序框架
2 parents ec0ae6e + d88a940 commit 27ae061

File tree

2 files changed

+119
-3
lines changed

2 files changed

+119
-3
lines changed

docs/book/25-Patterns.md

Lines changed: 119 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public class SingletonPattern {
7878
} catch(Exception e) {
7979
throw new RuntimeException(e);
8080
}
81-
}
81+
}
8282
} /* Output: 47 9 */
8383
```
8484
创建单例的关键是防止客户端程序员直接创建对象。 在这里,这是通过在Singleton类中将Resource的实现作为私有类来实现的。
@@ -103,9 +103,125 @@ public class SingletonPattern {
103103
<!-- Building Application Frameworks -->
104104
## 构建应用程序框架
105105

106+
应用程序框架允许您从一个类或一组类开始,创建一个新的应用程序,重用现有类中的大部分代码,并根据需要覆盖一个或多个方法来定制应用程序。
107+
108+
**模板方法模式**
109+
110+
应用程序框架中的一个基本概念是模板方法模式,它通常隐藏在底层,通过调用基类中的各种方法来驱动应用程序(为了创建应用程序,您已经覆盖了其中的一些方法)。
111+
112+
模板方法模式的一个重要特性是它是在基类中定义的,并且不能更改。它有时是一个 **private** 方法,但实际上总是 **final**。它调用其他基类方法(您覆盖的那些)来完成它的工作,但是它通常只作为初始化过程的一部分被调用(因此框架使用者不一定能够直接调用它)。
113+
114+
```Java
115+
// patterns/TemplateMethod.java
116+
// Simple demonstration of Template Method
117+
118+
abstract class ApplicationFramework {
119+
ApplicationFramework() {
120+
templateMethod();
121+
}
122+
123+
abstract void customize1();
124+
125+
abstract void customize2(); // "private" means automatically "final": private void templateMethod() { IntStream.range(0, 5).forEach( n -> { customize1(); customize2(); }); }}// Create a new "application": class MyApp extends ApplicationFramework { @Override void customize1() { System.out.print("Hello "); }@Override
126+
127+
void customize2() {
128+
System.out.println("World!");
129+
}
130+
}
131+
132+
public class TemplateMethod {
133+
public static void main(String[] args) {
134+
new MyApp();
135+
}
136+
}
137+
/*
138+
Output:
139+
Hello World!
140+
Hello World!
141+
Hello World!
142+
Hello World!
143+
Hello World!
144+
*/
145+
```
146+
147+
基类构造函数负责执行必要的初始化,然后启动运行应用程序的“engine”(模板方法模式)(在GUI应用程序中,这个“engine”是主事件循环)。框架使用者只提供
148+
**customize1()****customize2()** 的定义,然后“应用程序”已经就绪运行。
149+
150+
![](images/designproxy.png)
106151

107152
<!-- Fronting for an Implementation -->
108-
## 面向实施
153+
## 面向实现
154+
155+
代理模式和桥接模式都提供了在代码中使用的代理类;完成工作的真正类隐藏在这个代理类的后面。当您在代理中调用一个方法时,它只是反过来调用实现类中的方法。这两种模式非常相似,所以代理模式只是桥接模式的一种特殊情况。人们倾向于将两者合并,称为代理模式,但是术语“代理”有一个长期的和专门的含义,这可能解释了这两种模式不同的原因。基本思想很简单:从基类派生代理,同时派生一个或多个提供实现的类:创建代理对象时,给它一个可以调用实际工作类的方法的实现。
156+
157+
158+
在结构上,代理模式和桥接模式的区别很简单:代理模式只有一个实现,而桥接模式有多个实现。在设计模式中被认为是不同的:代理模式用于控制对其实现的访问,而桥接模式允许您动态更改实现。但是,如果您扩展了“控制对实现的访问”的概念,那么这两者就可以完美地结合在一起
159+
160+
**代理模式**
161+
162+
如果我们按照上面的关系图实现,它看起来是这样的:
163+
164+
```Java
165+
// patterns/ProxyDemo.java
166+
// Simple demonstration of the Proxy pattern
167+
interface ProxyBase {
168+
void f();
169+
170+
void g();
171+
172+
void h();
173+
}
174+
175+
class Proxy implements ProxyBase {
176+
private ProxyBase implementation;
177+
178+
Proxy() {
179+
implementation = new Implementation();
180+
}
181+
// Pass method calls to the implementation:
182+
@Override
183+
public void f() { implementation.f(); }
184+
@Override
185+
public void g() { implementation.g(); }
186+
@Override
187+
public void h() { implementation.h(); }
188+
}
189+
190+
class Implementation implements ProxyBase {
191+
public void f() {
192+
System.out.println("Implementation.f()");
193+
}
194+
195+
public void g() {
196+
System.out.println("Implementation.g()");
197+
}
198+
199+
public void h() {
200+
System.out.println("Implementation.h()");
201+
}
202+
}
203+
204+
public class ProxyDemo {
205+
public static void main(String[] args) {
206+
Proxy p = new Proxy();
207+
p.f();
208+
p.g();
209+
p.h();
210+
}
211+
}
212+
/*
213+
Output:
214+
Implementation.f()
215+
Implementation.g()
216+
Implementation.h()
217+
*/
218+
```
219+
220+
具体实现不需要与代理对象具有相同的接口;只要代理对象以某种方式“代表具体实现的方法调用,那么基本思想就算实现了。然而,拥有一个公共接口是很方便的,因此具体实现必须实现代理对象调用的所有方法。
221+
222+
**状态模式**
223+
224+
109225

110226

111227
<!-- Factories: Encapsulating Object Creation -->
@@ -161,4 +277,4 @@ public class SingletonPattern {
161277

162278
<!-- 分页 -->
163279

164-
<div style="page-break-after: always;"></div>
280+
<div style="page-break-after: always;"></div>

docs/images/designproxy.png

57.2 KB
Loading

0 commit comments

Comments
 (0)