1. 橋接模式就是bridge模式。
簡單的來說,就是一個類如果想往兩個維度擴充,就用耦合來代替繼承關係,進行排列組合。
所謂耦合就是在一個類當中持有另外一個類的對象。
通過耦合和繼承相結合,就可以排列組合出各種情況。
Bridge模式是為瞭解決類的層次和結構過於複雜的問題,而提出的。
類與類的關係:
1. 如果一個類的對象是另外一個類的成員變數,表示這個類是另外一個類的一部分。
2. 類的對象也可以作為另外一個類的方法的參數。
分析,如果一個類的對象是另外一個類的成員變數,耦合度很高。修改維護成本高。如果類的對象也可以作為另外一個類的方法的參數,相對來說耦合度低一些。
彙總關係:
1. GiftImpl類,是禮物類型的抽象類別(flower,ring…)。
package com.bjsxt.dp.bridge;
publicclass GiftImpl {
}
package com.bjsxt.dp.bridge;
publicclass Flower
extends GiftImpl {
}
package com.bjsxt.dp.bridge;
publicclass Flower
extends GiftImpl {
}
2. Gift類,是概念類型的抽象類別(wild,warm)。
package com.bjsxt.dp.bridge;
publicclass Gift {
//彙總關係,在gift當中持有GiftImpl的對象。
protected GiftImpl
impl;
}
package com.bjsxt.dp.bridge;
publicclass WarmGift
extends Gift{
//WarmGift從Gift繼承,並且在構造方法提供了一個參數
//這個參數就是來自父類的當中的一個對象
//這個對象就是另外一個維度擴充(flower,ring...)
public WarmGift(GiftImpl impl) {
this.impl = impl;
}
}
package com.bjsxt.dp.bridge;
publicclass WildGift
extends Gift {
public WildGift(Ring ring) {
this.impl =
impl;
}
}
通過這樣的方式就可以產生不同的排列組合。當然,這個是兩個維度擴充,至於3維或者更多,暫不考慮。
最後看看使用者類:
package com.bjsxt.dp.bridge;
publicclass Boy {
private String
name;
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
//使用的情況
publicvoid pursue(MM mm) {
//溫暖的花
Gift g1 = new WarmGift(new Flower());
//狂野的戒指
Gift g = new WildGift(new Ring());
//give(g, mm);
}
publicvoid give(Gift g, MM mm) {
}
}
2. adapter模式就是一個轉接器,提供了一個轉換的介面。感覺有點像個變壓器。
通常都有一個輸入和一個輸出。一個典型的應用就是:JDBC-ODBC橋。
典型的應用,就是inputstreamReader類,和outputstreamWriter類。能把inputStream轉換成為Reader,outputStream轉換成為writer。
下面說下在awt當中的adapter,從功能上來說,Adapter和Listener功能是重複的,但是listener是個介面,如果要實現listener介面,需要實現介面當中的所有的方法。比如說,在mouselistenter有mouseClicked, mouseEntered, mouseExited, mousePressed, mouseReleased六個方法。為了可以不用寫Listener當中所有的方法。我們可以選擇使用adapter介面。Adapter是個類,而listener是介面。Adapter實現了Listener介面。所以使用adapter的時候,不需要寫哪些不想實現的方法。可以唯寫需要實現的介面。所以adapter的意義在於方便使用者添加listener,如果不想實現listener,就添加一個adapter,同樣可以完成任務。