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

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

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

2019-11-10 23:54:38
字體:
來(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)系到一起的是電線(xià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)的父類(lèi)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è)父類(lèi),他們都各自有自己的特征和行為,當(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)基類(lèi)Switch,但風(fēng)扇和電燈是兩個(gè)不同的事物,相比定義一個(gè)基類(lèi),接口可能更合適。一般來(lái)說(shuō),他們都是電器。所以我們可以定義一個(gè)接口,如IElectricalEqupublic interface IElectricalEquipment {      public void powerOn();  //每個(gè)電器都可以打開(kāi)      public void powerOff(); //每個(gè)電器都可以關(guān)閉  }  

現(xiàn)在我們需要一座橋梁。在現(xiàn)實(shí)中,電線(xiàn)是橋梁。在我們對(duì)象設(shè)計(jì)中,開(kāi)關(guān)知道如何打開(kāi)和關(guān)閉電器,電器以某種方式聯(lián)系到開(kāi)關(guān)。這里我們沒(méi)有電線(xiàn),讓電器連接到開(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類(lèi)以便封裝一個(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)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 文昌市| 宜都市| 襄垣县| 铅山县| 诏安县| 洪泽县| 灵石县| 罗田县| 巴彦淖尔市| 澜沧| 怀远县| 屯昌县| 积石山| 奉化市| 无为县| 前郭尔| 靖安县| 盘锦市| 昌平区| 彩票| 淅川县| 长海县| 南木林县| 临高县| 镇江市| 十堰市| 青铜峡市| 仙游县| 济阳县| 东安县| 宜良县| 理塘县| 扶绥县| 纳雍县| 桃园县| 丹江口市| 工布江达县| 崇文区| 仪征市| 苍山县| 三原县|