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