參考於 : 大話設計模式 馬士兵設計模式視頻 寫在開頭: 橋接模式主要用於一件事物分成了兩個維度,進行排列組合,比如禮物,可以分成優雅的禮物(抽象),花(具體),排列組合優雅的花! 1.為什麼使用橋接模式 小丁追小彭,送禮物必不可少。面向對象的思維,如何去實現這個禮物,先定義一個禮物的介面或抽象類, ...
參考於 :
大話設計模式
馬士兵設計模式視頻
寫在開頭: 橋接模式主要用於一件事物分成了兩個維度,進行排列組合,比如禮物,可以分成優雅的禮物(抽象),花(具體),排列組合優雅的花!
1.為什麼使用橋接模式
小丁追小彭,送禮物必不可少。面向對象的思維,如何去實現這個禮物,先定義一個禮物的介面或抽象類,然後只要實現了這個介面那就算一個禮物。
小彭是一個精緻的女孩,我要送一個精緻的禮物,好,按照上面的思路,實現禮物介面。小丁進了花店,哇,花朵,嗯,花朵也算禮物,實現禮物介面。
小丁想挑精緻的花朵,用面向對象的思想,嗯,直接繼承精緻的禮物就實現了精緻花朵。
但是,小丁仔細一想,這隻是花店,只有花朵,實現起來不複雜,如果進了一家百貨商店,那麼就要這樣實現,相當麻煩。
2.使用橋接模式
使用前先解釋上面圖片中的話:
將抽象部分和實現部分分離 : 上面例子中,精緻的禮物就是一個比較抽象的部分,精緻的花就是一個實現部分,上面例子中,這兩個是繼承關係,現在需要進行分離。
使用聚合關係來替換繼承關係
下麵代碼中Gift介面可去,去了後類的關係就和最上面那張UML一樣
下麵代碼的UML類圖
package com.dingyu; /** * 實現了這個介面,表示你是一個禮物 * @author dingyu * */ public interface Gift { }
package com.dingyu; /** * 一個精緻的禮物 * 抽象部分有一個具體的部分 * @author dingyu * */ public class GraceGift implements Gift { private GiftImpl giftImpl; public GraceGift(GiftImpl giftImpl) { this.giftImpl = giftImpl; } public GiftImpl getGiftImpl() { return giftImpl; } public void setGiftImpl(GiftImpl giftImpl) { this.giftImpl = giftImpl; } }
package com.dingyu; /** * 具體的禮物 * @author dingyu * */ public interface GiftImpl { }
package com.dingyu; public class Flower implements GiftImpl { }
package com.dingyu; public class Shorts implements GiftImpl { }
package com.dingyu; /** * 男孩類 * * @author dingyu * */ public class Boy { private String name = "xiaoding"; public void sendGift() { Gift gift1; Gift gift2; gift1 = new GraceGift(new Shorts()); gift2 = new GraceGift(new Flower()); } }