文章優先發表在個人博客:https://www.xdx97.com/article/705731339978014720
1、引出橋接模式
我們有一個手機產品,手機下面有多個類型(直板、翻蓋),每個手機有多個生產商(小米、華爲)。
我們可以按照下圖的思路去構建出來我們的代碼
總結
- 如果我們新增一個翻蓋類型手機,那麼我們就會新增三個類。(翻蓋、小米、華爲)
- 如果我們再新增一個一加手機,那麼我們在每個類型下面都會再新增一個一加手機
- 這樣就會導致類爆炸。我們使用橋接模式去解決這個問題。
2、橋接模式
2-1、基本概念
橋接模式:是一種結構型模式,將實現與抽象放在兩個不同的類層次中,使兩個層次可以獨立改變。
橋接模式基於類的最小設計原則,通過使用封裝、聚合及繼承等行爲讓不同的類承擔不同的職責。它的主要特點是把抽象與行爲實現分離開來,從而可以保持各部分的獨立性以及應對他們的功能擴展。
1、Brand (品牌接口)
// 品牌
public interface Brand {
// 打電話
void call();
// 發消息
void sendMessage();
}
2、小米
public class XiaoMi implements Brand {
@Override
public void call() {
System.out.println("打電話 - 小米");
}
@Override
public void sendMessage() {
System.out.println("發消息 - 小米");
}
}
3、華爲
public class HuaWei implements Brand {
@Override
public void call() {
System.out.println("打電話 - 華爲");
}
@Override
public void sendMessage() {
System.out.println("發消息 - 華爲");
}
}
4、手機 (抽象類)
public abstract class Phone {
// 通過組合的方式去調用具體的手機(小米 / 華爲)
private Brand brand;
Phone (Brand brand){
this.brand = brand;
}
// 打電話
protected void call(){
brand.call();
}
// 發消息
protected void sendMessage(){
brand.sendMessage();
}
}
5、直板手機
public class StraightBoard extends Phone {
StraightBoard(Brand brand) {
super(brand);
}
// 打電話
@Override
public void call(){
System.out.print("直板手機 ");
super.call();
}
// 發消息
@Override
public void sendMessage(){
System.out.print("直板手機 ");
super.sendMessage();
}
}
6、翻蓋手機
public class FlipOver extends Phone {
FlipOver(Brand brand) {
super(brand);
}
// 打電話
@Override
public void call(){
System.out.print("翻蓋手機 ");
super.call();
}
// 發消息
@Override
public void sendMessage(){
System.out.print("翻蓋手機 ");
super.sendMessage();
}
}
測試
public class Main {
public static void main(String[] args) {
// 直板小米手機
StraightBoard xiaoMi1 = new StraightBoard(new XiaoMi());
xiaoMi1.call();
xiaoMi1.sendMessage();
// 直板華爲手機
StraightBoard huaWei1 = new StraightBoard(new HuaWei());
huaWei1.call();
huaWei1.sendMessage();
// 翻蓋小米手機
FlipOver xiaoMi2 = new FlipOver(new XiaoMi());
xiaoMi2.call();
xiaoMi2.sendMessage();
// 翻蓋華爲手機
FlipOver huaWei2 = new FlipOver(new HuaWei());
huaWei2.call();
huaWei2.sendMessage();
// 直板手機 打電話 - 小米
// 直板手機 發消息 - 小米
// 直板手機 打電話 - 華爲
// 直板手機 發消息 - 華爲
// 翻蓋手機 打電話 - 小米
// 翻蓋手機 發消息 - 小米
// 翻蓋手機 打電話 - 華爲
// 翻蓋手機 發消息 - 華爲
}
}
總結
- 假如我們使用最開始的做法。有M個手機類型,N個手機廠商,那麼最後的類個數 = N*M
- 而我們使用橋接模式,同樣的M個手機類型,N個手機廠商,最後的類個數 = N + M
- 橋接模式我們要找到關鍵的兩點:實現、抽象