設(shè)計(jì)模式—結(jié)構(gòu)型模式之橋接模式
將抽象與實(shí)現(xiàn)解耦,使兩者都可以獨(dú)立變化。
在現(xiàn)實(shí)生活中,某些類具有兩個(gè)或多個(gè)維度的變化,如圖形既可按形狀分,又可按顏色分。如何設(shè)計(jì)類似于 Photoshop 這樣的軟件,能畫不同形狀和不同顏色的圖形呢?如果用繼承方式,m 種形狀和 n 種顏色的圖形就有 m×n 種,不但對(duì)應(yīng)的子類很多,而且擴(kuò)展困難。不同顏色和字體的文字、不同品牌和功率的汽車。
橋接將繼承轉(zhuǎn)為關(guān)聯(lián),降低類之間的耦合度,減少代碼量。
橋接(Bridge)模式包含以下主要角色:
- 系統(tǒng)設(shè)計(jì)期間,如果這個(gè)類里面的一些東西,會(huì)擴(kuò)展很多,這個(gè)東西就應(yīng)該分離出來
- 抽象化(Abstraction)角色:定義抽象類,并包含一個(gè)對(duì)實(shí)現(xiàn)化對(duì)象的引用。
- 擴(kuò)展抽象化(Refined Abstraction)角色:是抽象化角色的子類,實(shí)現(xiàn)父類中的業(yè)務(wù)方法,并通過組合關(guān)系調(diào)用實(shí)現(xiàn)化角色中的業(yè)務(wù)方法。
- 實(shí)現(xiàn)化(Implementor)角色:定義實(shí)現(xiàn)化角色的接口,供擴(kuò)展抽象化角色調(diào)用。
- 具體實(shí)現(xiàn)化(Concrete Implementor)角色:給出實(shí)現(xiàn)化角色接口的具體實(shí)現(xiàn)。
舉例
如果我們有不同型號(hào)的手機(jī),每種型號(hào)的手機(jī)都有線下和線上兩種銷售渠道,兩種渠道的價(jià)格還不同。如果我們不使用設(shè)計(jì)模式,我們就需要定義線上渠道的不同型號(hào)手機(jī)類、線下渠道的不同型號(hào)手機(jī)類;如果我們?cè)僭黾右粋€(gè)渠道,又需要增加新的不同型號(hào)渠道手機(jī)類。我們能否把渠道分離出來呢?這便引出了橋接模式。
渠道抽象類:
/**
* 抽象渠道類
*/
public abstract class AbstarctChnnel {
private String channel;
private Integer price;
public AbstarctChnnel(String channel, Integer price) {
this.channel = channel;
this.price = price;
}
String getChannelInfo(){
return "渠道:"+this.channel + "\t價(jià)格:"+this.price;
}
}
線上渠道和線下渠道分別為:
/**
* 線上渠道
*/
public class OnlineChannel extends AbstarctChnnel{
public OnlineChannel(String channel, Integer price) {
super(channel, price);
}
}
/**
* 線下渠道
*/
public class OfflineChannel extends AbstarctChnnel{
public OfflineChannel(String channel, Integer price) {
super(channel, price);
}
}
我們的抽象手機(jī)類如下:
public abstract class AbstarctPhone {
//橋接在此.....設(shè)計(jì)期間就得想好
//【真正會(huì)引起此類變化的一個(gè)維度直接抽取出來,通過組合的方式接起來】
//橋接+適配器 ...
AbstarctChnnel chnnel;
abstract String getPhone();
public void setChnnel(AbstarctChnnel chnnel) {
this.chnnel = chnnel;
}
}
手機(jī)類如下:
public class BananaPhone extends AbstarctPhone{
@Override
String getPhone() {
return "香蕉手機(jī):"+this.chnnel.getChannelInfo();
}
}
測(cè)試類如下:
public class BridgeTest {
public static void main(String[] args) {
BananaPhone phone = new BananaPhone();
phone.setChnnel(new OfflineChannel("線下渠道",10000));
System.out.println("phone.getPhone() = " + phone.getPhone());
}
}
運(yùn)行結(jié)果如下:
如果我們?cè)傩略鲆粋€(gè)渠道,只要再擴(kuò)展出一個(gè)渠道類即可,不需要新增手機(jī)類。文章來源:http://www.zghlxwxcb.cn/news/detail-745911.html
總結(jié)
我們需要把真正會(huì)引起此類變化的維度,直接抽取出來,通過組合的方式拼接起來。文章來源地址http://www.zghlxwxcb.cn/news/detail-745911.html
到了這里,關(guān)于設(shè)計(jì)模式—結(jié)構(gòu)型模式之橋接模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!