云南房產(chǎn)網(wǎng)站建設(shè)seo基礎(chǔ)入門教程
一、問題場景
現(xiàn)在對”不同手機類型“的 “不同品牌”實現(xiàn)操作編程(比如: 開機、關(guān)機、上網(wǎng),打電話等)
二、傳統(tǒng)解決方案
傳統(tǒng)方案解決手機使用問題類圖:
三、傳統(tǒng)方案分析
傳統(tǒng)方案解決手機操作問題分析
1、擴展性問題(類爆炸),如果我們再增加手機的樣式(旋轉(zhuǎn)式),就需要增加各個品 牌手機的類,同樣如果我們增加一個手機品牌,也要在各個手機樣式類下增加。
2、違反了單一職責(zé)原則,當(dāng)我們增加手機樣式時,要同時增加所有品牌的手機,這 樣增加了代碼維護成本。
3、我們之前講過,解決多層次繼承導(dǎo)致類爆炸的問題,可以使用“組合大于繼承”的設(shè)計原則,而橋接模式就是“組合大于接觸”設(shè)計原則的實現(xiàn)。
四、橋接模式
1、定義
當(dāng)一個類存在兩個或者多個獨立變化維度時,我們通過組合的方式,讓這兩個或多個維度可以獨立進行擴展。
也就是,
將抽象和實現(xiàn)解耦,放在兩個不同的類層次中,讓它們可以獨立變化。
2、特點
橋接模式基于“組合優(yōu)于繼承”和“單一職責(zé)”原則,通過使用封裝,組合以及繼承等行為讓不同的類承擔(dān)不同的職責(zé)。主要特點是把抽象(Abstraction)和行為實現(xiàn)(Implementation)分離開來,從而保持各部分的獨立性以及應(yīng)對它們的功能擴展。
3、原理類圖
(1)Client類: 橋接模式的調(diào)用者
(2)抽象類(Abstraction): 維護了Implementor/即它的實現(xiàn)子類ConcretelmplementorA…,二者是組合關(guān)系,Abstraction充當(dāng)橋接類
(3)RefinedAbstraction: 是Abstraction抽象類的子類
(4)Implementor: 行為實現(xiàn)類的接口
(5)ConcreteImplementorA/B: 行為的具體實現(xiàn)類
4、代碼實現(xiàn)
public abstract class Phone {//組合品牌private Brand brand;//構(gòu)造器public Phone(Brand brand) {super();this.brand = brand;}protected void open() {this.brand.open();}protected void close() {brand.close();}protected void call() {brand.call();}}//折疊式手機類,繼承 抽象類 Phone
public class FoldedPhone extends Phone {//構(gòu)造器public FoldedPhone(Brand brand) {super(brand);}public void open() {super.open();System.out.println(" 折疊樣式手機 ");}public void close() {super.close();System.out.println(" 折疊樣式手機 ");}public void call() {super.call();System.out.println(" 折疊樣式手機 ");}
}//直立式手機類,繼承 抽象類 Phone
public class UpRightPhone extends Phone {//構(gòu)造器public UpRightPhone(Brand brand) {super(brand);}public void open() {super.open();System.out.println(" 直立樣式手機 ");}public void close() {super.close();System.out.println(" 直立樣式手機 ");}public void call() {super.call();System.out.println(" 直立樣式手機 ");}
}//接口
public interface Brand {void open();void close();void call();
}public class XiaoMi implements Brand {@Overridepublic void open() {// TODO Auto-generated method stubSystem.out.println(" 小米手機開機 ");}@Overridepublic void close() {// TODO Auto-generated method stubSystem.out.println(" 小米手機關(guān)機 ");}@Overridepublic void call() {// TODO Auto-generated method stubSystem.out.println(" 小米手機打電話 ");}}public class Vivo implements Brand {@Overridepublic void open() {// TODO Auto-generated method stubSystem.out.println(" Vivo手機開機 ");}@Overridepublic void close() {// TODO Auto-generated method stubSystem.out.println(" Vivo手機關(guān)機 ");}@Overridepublic void call() {// TODO Auto-generated method stubSystem.out.println(" Vivo手機打電話 ");}}//客戶端
public class Client {public static void main(String[] args) {//獲取折疊式手機 (樣式 + 品牌 )Phone phone1 = new FoldedPhone(new XiaoMi());phone1.open();phone1.call();phone1.close();System.out.println("=======================");Phone phone2 = new FoldedPhone(new Vivo());phone2.open();phone2.call();phone2.close();System.out.println("==============");UpRightPhone phone3 = new UpRightPhone(new XiaoMi());phone3.open();phone3.call();phone3.close();System.out.println("==============");UpRightPhone phone4 = new UpRightPhone(new Vivo());phone4.open();phone4.call();phone4.close();}}
5、橋接模式適用場景
適用于不希望使用繼承或者因為多層次繼承導(dǎo)致系統(tǒng)類的個數(shù)急劇增加。比如:
(1)JDC驅(qū)動程序
(2)銀行轉(zhuǎn)賬系統(tǒng)
轉(zhuǎn)賬分類:網(wǎng)上轉(zhuǎn)賬,柜臺轉(zhuǎn)賬,AMT轉(zhuǎn)賬
轉(zhuǎn)賬用戶分類:普通用戶,銀行卡用戶,金卡用戶
(3)消息管理
消息類型:即時消息,延時消息
消息分類:手機短信,郵件消息,QQ消息