@TOC
手機(jī)操作問題
現(xiàn)在對不同手機(jī)類型的不同品牌實現(xiàn)操作編程(比如 :開機(jī)、關(guān)機(jī)、上網(wǎng)、打電話等等),如圖 :
傳統(tǒng)方案解決手機(jī)操作問題
傳統(tǒng)方法對應(yīng)的類圖
傳統(tǒng)方案解決手機(jī)操作問題分析
1)擴(kuò)展性問題(類爆炸),如果我們再增加手機(jī)的樣式(旋轉(zhuǎn)式),就需要增加各個品牌手機(jī)的類,同樣如果我們增加一個手機(jī)品牌,也要在各個手機(jī)樣式類下增加。
2)違反類單一職責(zé)原則,當(dāng)我們增加手機(jī)樣式時,要同時增加所有品牌的手機(jī),這樣增加類代碼維護(hù)成本。
3)解決方案 - 使用橋接模式
橋接模式(Bridge)-基本介紹
1)橋接模式(Bridge 模式)是指 : 將實現(xiàn)與抽象放在兩個不同的類層次中,使兩個層次可以獨立改變。
2)是一種結(jié)構(gòu)型設(shè)計模式
3)Bridge模式基于類的最小設(shè)計原則,通過使用封裝、聚合及繼承等行為讓不同的類承擔(dān)不同的職責(zé)。它的主要特點是把抽象(Abstraction)與行為實現(xiàn)(Implementation)分離開來,從而可以保持各部分的獨立性以及應(yīng)對他們的功能擴(kuò)展。
說明 :
1)Client類 :橋接模式的調(diào)用者。
2)抽象類(Abstraction) :維護(hù)了Implementor / 即它的實現(xiàn)類ConcreteImplementorA..,二者是聚合關(guān)系,Abstraction充當(dāng)橋接類。
3)RefinedAbstraction :是Abstraction抽象類的子類。
4)Implementor :行為實現(xiàn)類的接口
5)ConcreteImplementor A/ B : 行為的具體實現(xiàn)類
6)從UML圖 :這里的抽象類和接口是聚合的關(guān)系,其實調(diào)用和被調(diào)用關(guān)系
橋接模式解決手機(jī)操作問題
使用橋接模式改進(jìn)傳統(tǒng)方式,讓程序具有很好的擴(kuò)展性,利用程序維護(hù)
1)應(yīng)用實例和前面一樣
2)使用橋接模式對應(yīng)的類圖
package com.example.demo.bridge;
/**
* 接口
* @author zhaozhaohai
*
*/
public interface Brand {
void open();
void close();
void call();
}
package com.example.demo.bridge;
public class Vivo implements Brand{
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("Vivo手機(jī)開機(jī)");
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println("Vivo手機(jī)關(guān)機(jī)");
}
@Override
public void call() {
// TODO Auto-generated method stub
System.out.println("Vivo手機(jī)打電話");
}
}
package com.example.demo.bridge;
public class XiaoMi implements Brand{
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("小米手機(jī)開機(jī)");
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println("小米手機(jī)關(guān)機(jī)");
}
@Override
public void call() {
// TODO Auto-generated method stub
System.out.println("小米手機(jī)打電話");
}
}
package com.example.demo.bridge;
public abstract class Phone {
/**
* 組合品牌
*/
private Brand brand;
public Phone(Brand brand) {
this.brand = brand;
}
protected void open() {
this.brand.open();
}
protected void close() {
this.brand.close();
}
protected void call() {
this.brand.call();
}
}
package com.example.demo.bridge;
/**
* 折疊式手機(jī)類,繼承抽象類Phone
* @author zhaozhaohai
*
*/
public class FoldedPhone extends Phone{
public FoldedPhone(Brand brand) {
super(brand);
// TODO Auto-generated constructor stub
}
public void open() {
super.open();
System.out.println(" 折疊樣式手機(jī) ");
}
public void close() {
super.close();
System.out.println(" 折疊樣式手機(jī) ");
}
public void cell() {
super.call();
System.out.println(" 折疊樣式手機(jī) ");
}
}
package com.example.demo.bridge;
public class UpRightPhone extends Phone{
public UpRightPhone(Brand brand) {
super(brand);
// TODO Auto-generated constructor stub
}
public void open() {
super.open();
System.out.println(" 直立樣式手機(jī) ");
}
public void close() {
super.close();
System.out.println(" 直立樣式手機(jī) ");
}
public void cell() {
super.call();
System.out.println(" 直立樣式手機(jī) ");
}
}
package com.example.demo.bridge;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 獲取折疊式手機(jī)(樣式 + 品牌)
Phone phone1 = new FoldedPhone(new XiaoMi());
phone1.open();
phone1.call();
phone1.close();
Phone phone2 = new FoldedPhone(new Vivo());
phone2.open();
phone2.call();
phone2.close();
Phone phone3 = new UpRightPhone(new XiaoMi());
phone3.open();
phone3.call();
phone3.close();
}
}
橋接模式在JDBC中的源碼解析
橋接模式的注意事項和細(xì)節(jié)
1)實現(xiàn)了抽象和實現(xiàn)部分的分離,從而極大的提供了系統(tǒng)的靈活性,讓抽象部分和實現(xiàn)部分獨立開來,這有助于系統(tǒng)進(jìn)行分層設(shè)計,從而產(chǎn)生更好的結(jié)構(gòu)化系統(tǒng)。
2)對于系統(tǒng)的高層部分,只需要知道抽象部分和實現(xiàn)部分的接口就可以了,其它部分由具體業(yè)務(wù)來完成。
3)橋接模式替代多層繼承方案,可以減少子類的個數(shù),降低系統(tǒng)的管理和維護(hù)成本。
4)橋接模式的引入增加了系統(tǒng)的理解和設(shè)計難度,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層,要求開發(fā)者針對抽象進(jìn)行設(shè)計和編程
5)橋接模式要求正確識別出系統(tǒng)中兩個獨立變化的維度,因此其使用范圍有一定的局限性,即需要有這樣的應(yīng)用場景。
橋接模式其它應(yīng)用場景
1)對于那些不希望使用繼承或因為多層次繼承導(dǎo)致系統(tǒng)類的個數(shù)急劇增加的系統(tǒng),橋接模式尤為適用
2)常見的應(yīng)用場景 :
JDBC驅(qū)動程序
銀行轉(zhuǎn)賬系統(tǒng) :
轉(zhuǎn)賬分類 : 網(wǎng)上轉(zhuǎn)賬,柜臺轉(zhuǎn)賬,AMT轉(zhuǎn)賬(抽象)
轉(zhuǎn)賬用戶類型 :普通用戶,銀卡用戶,金卡用戶(實現(xiàn))
消息管理
消息類型 :即時消息,延時消息(抽象)
消息分類 :手機(jī)短信,郵件消息,QQ消息(實現(xiàn))