Java設計模式 之 橋接模式
假設現在要用不同的方式組裝不同的電路板,我們先創建統一的 構建方式類 及 電路板抽象類,代碼如下:
public interface IBuildWay {
// 傳入電路板名字
void build(String boardName);
}
public abstract class BaseBoard {
abstract void build();
}
我們來實現 正常構建速度的方式的類 及 構建小米手機電路板:
public class BuildNormalWay implements IBuildWay{
@Override
public void build(String boardName) {
System.out.println(boardName + ": Build Normal Way");
}
}
public class XiaomiBoard extends BaseBoard {
public XiaomiBoard(BuildNormalWay action) {
super(action);
}
@Override
void build() {
action.build("XiaomiBoard");
}
}
public class BuildDemo {
public static void main(String[] args) {
BuildNormalWay normalWay = new BuildNormalWay();
BaseBoard xiaomi = new XiaomiBoard(normalWay);
xiaomi.build();
}
}
上述代碼輸出 XiaomiBoard: Build Normal Way,上述代碼可以實現部分需求,但我們發現 電路板不是單一的,實現的方式也不是單一 有快有慢
橋接模式實現
這時候我們可以使用 橋接模式 來實現需求,將抽象部分與實現部分分離,使它們都可以獨立的變化,代碼如下:
構建方式:
// 實現接口
public interface IBuildWay {
void build(String boardName);
}
快速組裝方式
public class BuildQuickWay implements IBuildWay{
@Override
public void build(String boardName) {
System.out.println(boardName + ": Build Quick Way");
}
}
慢速組裝方式
public class BuildSlowWay implements IBuildWay {
@Override
public void build(String boardName) {
System.out.println(boardName + ": Build Slow Way");
}
}
電路板:
// 實現公共抽象類
public abstract class BaseBoard {
protected IBuildWay action;
public BaseBoard(IBuildWay action) {
this.action = action;
}
abstract void build();
}
蘋果電路板
public class IPhoneBoard extends BaseBoard{
public IPhoneBoard(IBuildWay action) {
super(action);
}
@Override
void build() {
// 實現抽象方法,並調用接口
// 內部實現抽象方法(可擴展)
// 再調用外部的實現接口
action.build("IPhoneBoard");
}
}
小米電路板
public class XiaomiBoard extends BaseBoard {
public XiaomiBoard(IBuildWay action) {
super(action);
}
@Override
void build() {
// 實現抽象方法,並調用接口
// 內部實現抽象方法(可擴展)
// 再調用外部的實現接口
action.build("XiaomiBoard");
}
}
執行
public class BuildDemo {
public static void main(String[] args) {
//不同的接口實現
IBuildWay quickWay = new BuildQuickWay();
BaseBoard xiaomi = new XiaomiBoard(quickWay);
IBuildWay slowWay = new BuildSlowWay();
BaseBoard iPhone = new IPhoneBoard(slowWay);
xiaomi.build();
iPhone.build();
}
}
//輸出:
//XiaomiBoard: Build Quick Way
//IPhoneBoard: Build Slow Way
我們會發現使用 橋接模式 ,很好使 電路板 和 實現方式 可以各自擴展而不會相互耦合在一起。
我們最後來總結下
橋接模式
目的:將抽象部分與實現部分分離,使它們都可以獨立的變化。
何時使用:實現系統可能有多個角度分類,每一種角度都可能變化。
實現場景:在有多種可能會變化的情況下,用繼承會造成類爆炸問題,擴展起來不靈活。
如何解決:把這種多角度分類分離出來,讓它們獨立變化,減少它們之間耦合。
關鍵代碼:抽象類依賴實現類。
其他模式可點擊鏈接進目錄閱讀了解:http://blog.csdn.net/xiao_wanzi94/article/details/78118092