国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

設(shè)計(jì)模式——橋接模式(BridgeMode)

2019-11-10 21:28:50
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

要想正確理解設(shè)計(jì)模式,首先必須明確它是為了解決什么問(wèn)題而提出來(lái)的。

設(shè)計(jì)模式學(xué)習(xí)筆記

——Shulin

轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.net/zhshulin

橋接模式的定義:"將抽象部分與實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化"。

橋接模式是所有面向?qū)ο竽J降幕A(chǔ),通過(guò)對(duì)橋接模式的學(xué)習(xí)來(lái)理解設(shè)計(jì)模式的思想。理由如下:

1、它教導(dǎo)如何思考抽象,這是面向?qū)ο笤O(shè)計(jì)模式的關(guān)鍵概念。

2、它實(shí)現(xiàn)了基本的OOD原則。

3、它容易理解。

4、如果正確理解該模式,學(xué)習(xí)其他模式會(huì)很容易。

假設(shè)以下場(chǎng)景:

我們房間里有些電器(電燈,風(fēng)扇等)。這些設(shè)備按照某些方式布局,并由開(kāi)關(guān)控制。任何時(shí)候你都能替換或排查一個(gè)電器而不用碰到其他東西。例如,你可以換一個(gè)電燈而不需要換開(kāi)關(guān)。同樣,你可以換一個(gè)開(kāi)關(guān)或排查它而不需要碰到或替換相應(yīng)的電燈或風(fēng)扇;甚至你可以用把電燈連接到風(fēng)扇的開(kāi)關(guān)上,把風(fēng)扇連到電燈的開(kāi)關(guān)上,而不需要碰到開(kāi)關(guān)。

當(dāng)不同東西聯(lián)系在一起時(shí),它們應(yīng)該按照一定方式聯(lián)系:修改或替換一個(gè)系統(tǒng)時(shí)不會(huì)影響到另一個(gè),或者說(shuō)即便有,也應(yīng)該最小化。這能夠讓你的系統(tǒng)易于管理,且成本低。

把電燈/風(fēng)扇和開(kāi)關(guān)聯(lián)系到一起的是電線和電器布局。我們可以它們看做不同系統(tǒng)間相互聯(lián)系的橋梁。其基本的思想是,一個(gè)事物不能和另一外一個(gè)事物直接聯(lián)系。它們應(yīng)當(dāng)通過(guò)某些橋梁或接口聯(lián)系在一起。用軟件術(shù)語(yǔ)來(lái)說(shuō),這叫“松耦合”。

例子中我們有開(kāi)關(guān),可能有幾種開(kāi)關(guān),如普通的開(kāi)關(guān),漂亮的開(kāi)關(guān),但通常來(lái)說(shuō)它們還是開(kāi)關(guān),并且每種開(kāi)關(guān)都能夠打開(kāi)和關(guān)閉。

所以下面我們會(huì)有一個(gè)開(kāi)關(guān)的父類Switch:

[java] view plain copy PRint?在CODE上查看代碼片public class Switch {                  public void On() {  }               public void Off(){  }     }   

接下來(lái)我們會(huì)有其他的具體的開(kāi)關(guān)來(lái)繼承這個(gè)父類,他們都各自有自己的特征和行為,當(dāng)然最基本的就是開(kāi)、關(guān),如:

[java] view%20plain copy print?public class FancySwitch extends Switch {      public void on(){          System.out.println("打開(kāi)開(kāi)關(guān)!!!!");      }      public void off(){          System.out.println("關(guān)閉開(kāi)關(guān)!!!!");      }  }  [java] view%20plain copy print?public class NormalSwitch extends Switch {      public void on(){          System.out.println("打開(kāi)開(kāi)關(guān)!!!!");      }      public void off(){          System.out.println("關(guān)閉開(kāi)關(guān)!!!!");      }        }  

對(duì)于電燈和電扇等具體的電器,根據(jù)OODP的開(kāi)放閉合原則,我們知道只要可能,就應(yīng)該嘗試抽象

跟開(kāi)關(guān)不一樣,風(fēng)扇和電燈等是兩種不同的事物。對(duì)于開(kāi)關(guān),我們能夠使用一個(gè)開(kāi)關(guān)基類Switch,但風(fēng)扇和電燈是兩個(gè)不同的事物,相比定義一個(gè)基類,接口可能更合適。一般來(lái)說(shuō),他們都是電器。所以我們可以定義一個(gè)接口,如IElectricalEqupublic interface IElectricalEquipment {      public void powerOn();  //每個(gè)電器都可以打開(kāi)      public void powerOff(); //每個(gè)電器都可以關(guān)閉  }  

現(xiàn)在我們需要一座橋梁。在現(xiàn)實(shí)中,電線是橋梁。在我們對(duì)象設(shè)計(jì)中,開(kāi)關(guān)知道如何打開(kāi)和關(guān)閉電器,電器以某種方式聯(lián)系到開(kāi)關(guān)。這里我們沒(méi)有電線,讓電器連接到開(kāi)關(guān)的唯一方式是封裝。但開(kāi)關(guān)不能直接知道風(fēng)扇或電燈。開(kāi)關(guān)應(yīng)當(dāng)知道一個(gè)電器IElectricalEquipment能夠打開(kāi)或關(guān)閉。這意味著,Switch應(yīng)該有一個(gè)IElectricalEquipment實(shí)例。

對(duì)風(fēng)扇或電燈的封裝的實(shí)例是一個(gè)橋梁。所以讓我們修改Switch類以便封裝一個(gè)電器:

[java] view%20plain copy print?public class Switch {            public IElectricalEquipment iEquip;              public IElectricalEquipment getiEquip() {          return iEquip;      }      public void setiEquip(IElectricalEquipment iEquip) {          this.iEquip = iEquip;      }      public void On() {                //開(kāi)關(guān)打開(kāi)                }              public void Off() {                //開(kāi)關(guān)關(guān)閉            }       }   

下面定義真實(shí)的電器:風(fēng)扇和電燈,他們都實(shí)現(xiàn)了IElectricalEquipment接口。

電扇:

[java] view%20plain copy print?public class Fan implements IElectricalEquipment {      @Override      public void powerOn() {          System.out.println("打開(kāi)電扇!");      }       @Override      public void powerOff() {          System.out.println("關(guān)閉電風(fēng)扇!");      }  }  電燈:

[java] view%20plain copy print?public class Light implements IElectricalEquipment {            @Override      public void powerOn() {          System.out.println("打開(kāi)電燈!");      }        @Override      public void powerOff() {          System.out.println("電燈關(guān)閉!");      }    }  

現(xiàn)在開(kāi)關(guān)必須可以控制電器:

[java] view%20plain copy print?派生到我的代碼片public class BridgeModeDemo {        public static void main(String[] args) {          Switch fancySwitch = new FancySwitch(); //實(shí)例化漂亮的開(kāi)關(guān)          Switch normalSwitch = new NormalSwitch();   //實(shí)例化普通開(kāi)關(guān)          IElectricalEquipment fan = new Fan();   //實(shí)例化電風(fēng)扇          IElectricalEquipment light = new Light();   //實(shí)例化電燈          normalSwitch.setiEquip(light);          fancySwitch.setiEquip(fan);          fancySwitch.getiEquip().powerOn();  //此時(shí)具體的開(kāi)關(guān)和電扇連接起來(lái)了          normalSwitch.getiEquip().powerOn(); //打開(kāi)電燈      }    }  
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 康马县| 济宁市| 霍山县| 台北县| 南溪县| 五原县| 雷州市| 西峡县| 迁西县| 萝北县| 库尔勒市| 兴隆县| 莫力| 沙湾县| 贵南县| 大新县| 抚远县| 潞西市| 平原县| 博野县| 共和县| 淮滨县| 关岭| 北京市| 永丰县| 家居| 大荔县| 军事| 墨江| 汶川县| 华池县| 运城市| 天津市| 蓬溪县| 宣城市| 贵南县| 广宗县| 南平市| 东平县| 清徐县| 柳林县|