背景
??????我們都去買過手機,手機按照品牌分可以分為華為、小米、oppo、vivo等品牌,如果這些手機按照內存分又可以分為4G、6G、8G等等。假如我們每一種手機都想要玩一下,至少需要4*3個。這對我們來說這些手機也太多了,竟然有12個,最主要的是手機品牌和內存是放在一起的。現在有這樣一種機制,手機牌品商是一個公司,做手機內存的是一個公司,想要做什么手機我們只需要讓其兩者搭配起來即可。有點類似于全球貿易分工明確的思想,這就是橋接模式,把兩個不同維度的東西橋接起來。
一.認識橋接模式
1、概念
將抽象部分與它實現部分分離,使它們都可以獨立地變化。
2、例子說明
??????從上面的例子我們可以看到,我們的手機可以從兩個維度進行變化,一個是品牌,一個是內存。此時我們就可以通過橋接模式將這兩個維度分離開來,每一個維度都可以獨立擴展。比如說手機品牌,可以又出現了蘋果、三星、錘子等等。內存方面又可以生產10G、16G的了。從專業的角度來看可以這樣定義橋接模式:
橋接模式是一種很實用的結構型設計模式,如果軟件系統中某個類存在兩個獨立變化的維度,通過該模式可以將這兩個維度分離出來,使兩者可以獨立擴展,讓系統更加符合“單一職責原則”。
3、類圖
上面的例子我們畫一張類圖來表示一下:
基本上意思就是這,也就是我們買手機的時候有兩個維度可供我們選擇:一個是品牌一個是內存。
(1)client:指的是我們買手機的人。
(2)Abstraction(抽象類):指的是手機抽象類
(3)Refined Abstraction(具體類):指的是具體手機品牌
(4)Implementor:在這里相當于手機的其他組件,內存
(5)ConcreteImplementor:具體的內存型號。
二.代碼實現
第一步:定義Implementor,這里定義手機內存接口
public interface Memory {
void addMemory();
}
第二步:定義ConcreteImplementor,這里指具體的內存
內存這里定義了兩種一種是6G,一種是8G
public class Memory6G implements Memory {
@Override
public void addMemory() {
System.out.println("添加了6G內存");
}
}
public class Memory8G implements Memory {
@Override
public void addMemory() {
System.out.println("添加了8G內存");
}
}
第三步:定義Abstraction手機抽象類
public abstract class Phone {
public Memory memory;
public void setMemory(Memory memory)
{
this.memory = memory;
}
public abstract void buyPhone();
}
第四步:定義Refined Abstraction(具體的手機品牌)
首先是華為
public class Huawei extends Phone {
@Override
public void buyPhone() {
memory.addMemory();
System.out.println("購買華為手機");
}
}
其次是蘋果
public class Apple extends Phone {
@Override
public void buyPhone() {
memory.addMemory();
System.out.println("購買蘋果手機");
}
}
第五步:測試
Memory memory6G = new Memory6G();
Phone huawei = new Huawei();
huawei.setMemory(memory6G);
huawei.buyPhone();
Memory memory8G = new Memory8G();
Phone apple = new Apple();
apple.setMemory(memory8G);
apple.buyPhone();
三.分析橋接模式
1.為什么使用橋接模式不使用繼承呢?
繼承是一種強耦合關系,子類與父類有非常緊密的依賴關系,父類的任何變化 都會導致子類發生變化。因此才使用橋接模式,使用了橋接模式之后,我們的兩個維度就像橋梁一樣被鏈接了起來。體現了松耦合的特性。
2.橋接模式的優點
(1)分離抽象和實現部分:把手機、內存抽象出來。實現與之分離。
(2)松耦合:兩個維度分開
(3)單一職責原則:每個維度各干各的活
關于橋接模式的使用場景我覺得你只需要知道他的思想,然后在遇到問題的時候能夠想到這種模式即可。