引言
??咋一看這個模式,看的一頭懵逼霍弹,純概念很來理解。舉個例子吧 就像一座橋娃弓,鏈接兩端典格。先回顧上一節(jié)的裝飾模式,下面我們來細(xì)說這個橋接模式台丛。
示例地址
??Demo
類圖
定義
??將抽象部分與實現(xiàn)部分分離钝计,使它們都可以獨立進行變化。
使用場景
??從模式的定義中我們大致可以了解到齐佳,這里"橋梁"的作用其實就是連接“抽象部分”與“實現(xiàn)部分”私恬,但是事實上,任何多維度變化類或者說多個樹狀類之間的耦合都可以使用橋接模式來實現(xiàn)解耦炼吴。
??如果一個系統(tǒng)需要在構(gòu)建的抽象化角色和具體化角色之間增加更多的靈活性本鸣,避免在兩個層次之間建立靜態(tài)的繼承聯(lián)系,可以通過橋接模式使他們在抽象層建立一個關(guān)聯(lián)關(guān)系硅蹦。
??對于那些不希望使用繼承或因為多層次繼承導(dǎo)致系統(tǒng)類的個數(shù)急劇增加的系統(tǒng)荣德,也可以考慮用橋接模式。
??一個類存在兩個獨立變化的維度童芹,且這兩個維度都需要進行擴展涮瞻。
橋接模式示例
??我們在使用ppt畫圖的時候,可以繪制圓形、正方形假褪、三角形署咽。
然后我們一個填充不同的顏色,例如白色、黑色生音、紅色宁否。這樣就生成了3*3=9種,如果我們按照繼承的方式實現(xiàn)的話。要生成9個類缀遍,如果我多一種顏色的話慕匠,就需要重新寫3個類。
繼承方式實現(xiàn)
1. 定義形狀類
/**
* 形狀
*
* @author 512573717@qq.com
* @created 2018/7/27 下午4:03.
*/
public abstract class Shape {
public abstract void draw();
}
2. 正方形的實現(xiàn)
/**
* 正方形
*
* @author 512573717@qq.com
* @created 2018/7/27 下午4:06.
*/
public class Square extends Shape {
@Override
public void draw() {
System.out.println("正方形");
}
}
3. 圓形的實現(xiàn)
/**
* 圓形
*
* @author 512573717@qq.com
* @created 2018/7/27 下午4:05.
*/
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("圓形");
}
}
4. 白色的正方形
/**
* 白色的正方形
*
* @author 512573717@qq.com
* @created 2018/7/27 下午4:10.
*/
public class WhiteSquare extends Square {
@Override
public void draw() {
System.out.print("白色的");
super.draw();
}
}
5. 紅色的正方形
/**
* 紅色的正方形
*
* @author 512573717@qq.com
* @created 2018/7/27 下午4:11.
*/
public class RedSquare extends Square {
@Override
public void draw() {
System.out.print("紅色的");
super.draw();
}
}
6. 白色的圓形
/**
* 白色的圓形
*
* @author 512573717@qq.com
* @created 2018/7/27 下午4:07.
*/
public class WhiteCircle extends Circle {
@Override
public void draw() {
System.out.print("白色的");
super.draw();
}
}
7. 紅色的圓形
/**
* 紅色的圓形
*
* @author 512573717@qq.com
* @created 2018/7/27 下午4:09.
*/
public class RedCircle extends Circle {
@Override
public void draw() {
System.out.print("紅色的");
super.draw();
}
}
8. Client
// 方式一 通過繼承
WhiteSquare whiteSquare = new WhiteSquare();
whiteSquare.draw();
WhiteCircle whiteCircle = new WhiteCircle();
whiteCircle.draw();
9. 缺點
??1. 采用了多層繼承結(jié)構(gòu)域醇,導(dǎo)致系統(tǒng)中類的個數(shù)急劇增加台谊,系統(tǒng)擴展麻煩。
??2. 不利于擴展譬挚,增加一個新的顏色圖形時锅铅,需要新增類。
橋接模式
1. 定義形狀類
/**
* 形狀
*
* @author 512573717@qq.com
* @created 2018/7/27 下午3:27.
*
*/
public abstract class Shape {
protected IColor mIColor;
public void setIColor(IColor IColor) {
mIColor = IColor;
}
public abstract void draw();
}
2. 顏色接口
/**
* 顏色的接口
*
* @author 512573717@qq.com
* @created 2018/7/27 下午3:29.
*
*/
public interface IColor {
void getColor();
}
3. 圓形
/**
* 圓形
*
* @author 512573717@qq.com
* @created 2018/7/27 下午3:38.
*/
public class Circle extends Shape {
@Override
public void draw() {
mIColor.getColor();
System.out.println("圓形...");
}
}
4. 正方形
/**
* 正方形
*
* @author 512573717@qq.com
* @created 2018/7/27 下午3:39.
*
*/
public class Square extends Shape {
@Override
public void draw() {
mIColor.getColor();
System.out.println("正方形...");
}
}
5. 白色的實現(xiàn)
/**
* 白色
*
* @author 512573717@qq.com
* @created 2018/7/27 下午3:38.
*
*/
public class WhiteColor implements IColor {
@Override
public void getColor() {
System.out.print("白色的");
}
}
6. 紅色的實現(xiàn)
/**
* 紅色
*
* @author 512573717@qq.com
* @created 2018/7/27 下午3:35.
*
*/
public class RedColor implements IColor {
@Override
public void getColor() {
System.out.print("紅色的");
}
}
7. Client
//方式二:橋接模式
//白色
IColor white = new WhiteColor();
//白色的正方形
Shape square = new Square();
square.setIColor(white);
square.draw();
//白色的圓形
Shape circle = new Circle();
circle.setIColor(white);
circle.draw();
總結(jié)
??1. 分離抽象接口及其實現(xiàn)部分殴瘦。所謂抽象和實現(xiàn)沿著各自維度的變化狠角,也就是說抽象和實現(xiàn)不再在同一個繼承層次結(jié)構(gòu)中,而是“子類化”它們蚪腋,使它們各自都具有自己的子類丰歌,以便任何組合子類姨蟋,從而獲得多維度組合對象。
??2. 橋接模式提高了系統(tǒng)的可擴展性立帖,在兩個變化維度中任意擴展一個維度眼溶,都不需要修改原有系統(tǒng),符合“開閉原則”晓勇。