1. 寫在前面
在前面的2-6小節中,我們學習了設計模式中的創建型模式。其中包括了以下幾種:
-
工廠模式 FactoryMethod
:用工廠接口 & 工廠實現類的方式,將類的實例化放在子類(工廠實現類)中完成 -
原型 Sterotype
: 用已有的實例對象去創建新的對象。這里涉及到了 deep copy -
生成器 Builder
:即分步去組裝。 -
單例 sinlgeton
:即一個類只能有一個實例對象,并且有一個訪問節點。
整體來說,這里的創建型模式還是比較 simple 的。
下面我們來看一下結構性設計模式。
2. 結構類設計模式
所謂 結構類設計模式
是指通過各種組合,獲得更靈活的性能、更穩定的表現。
盡管
java
本身提供了繼承等一些列模式,用以靈活的開發。但是事實上還是不夠。
因此,這里有了一系列的結構類設計模式
3. 適配器 Adapter
適配器 Adapter
的概念很好理解,生活中也經常使用。
本科的時候玩的單片機大都是 5V 直流電,而我們的電網都給的是220V交流電,因此我們需要一個充電器將二者進行轉換。這個充電器就叫做 Adapter
。
在 java 的世界中也是如此,當我們有一個場景,需要將某一類對象 統一轉成其他類的對象時,就需要一個 Adapter
。
4. 用法
考慮如下一個 case :
我們有一個實現 Callable
接口的 Task
類:
public class Task implements Callable<Long> {
private long num;
public Task(long num) {
this.num = num;
}
public Long call() throws Exception {
long r = 0;
for (long n = 1; n <= this.num; n++) {
r = r + n;
}
System.out.println("Result: " + r);
return r;
}
}
現在我們想要使用 Thread
的方式開啟一個線程來做這個事情:
Callable<Long> callable = new Task(123450000L);
Thread thread = new Thread(callable); // compile error!
thread.start();
可以看到第二行是編譯不通過的。因為 Thread
的方式只接受實現了 Runnable
接口的類。
這時候我們就可以整一個 RunnableAdapter
, 這個 Adapter
就負接受一個 callable
,輸出一個 runnable
。
這里使用
Adapter
而不是直接改寫原來的Task
類,因為Task
類可能在別的地方使用
這個 RunnableAdapter
接受一個 callable , 返回一個 runnable。
public class RunnableAdapter implements Runnable{
// 引用待轉換接口
private Callable<?> callable;
public RunnableAdpater(Callable<> callable){
this.callable = callable;
}
// 實現指定接口
public void run(){
try{
callable.call();
}catch (Exception e){
throw new RuntimeException(e);
}
}
}
可以看到,這里的適配器其實做了一層封裝,適配器接收了一個實現
Callable
的callable
對象,然后自己實現了Runnable
接口,重寫了run()
方法,在該方法里實現了callable
對象的業務邏輯。
下面就可以用之前的方式來做這個事情了。
Callable<Long> callable = new Task(123450000L);
Thread thread = new Thread(new RunnableAdapter(callable));
thread.start();
5. 總結
-
Adapter
用于將一類對象轉換成為符合某個標準的另一類對象 - 實現分為3步:
(1)接受 A 類對象
(2)實現A類對象的業務邏輯
(3)輸出符合某個標準的B類對象