java設計模式-橋接模式
阿新 • • 發佈:2018-06-05
送禮物 one dea setname auth imp ide span pro
使用聚合代替繼承;
禮物的具體實現類,GiftImpl.java:
1.背景
追MM的例子,Boy追MM,需要送禮物Gift,有Flower,Ring繼承自Gift;
還有WarmGift溫暖的禮物,WildGift狂野的禮物;
Boy:
public class Boy { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } publicView Codevoid pursue(MM mm){ Gift g = new Ring(); give(g, mm); } public void give(Gift g, MM mm){ } }
MM
public class MM { private String name; public String getName() { return name; } public void setName(String name) {View Codethis.name = name; } }
其他的一些禮物類,都繼承於Gift:
public class Gift { } public class Flower extends Gift{ } public class Ring extends Gift{ } public class WarmGift extends Gift{ } public class WildGift extends Gift{ }View Code
Gift在往子類擴展,擴展類型的時候,它會有兩個維度上的擴展;
一種是具體的維度,比如說ring 一種是類型上的劃分,比如是warm的,wild的; 比如現在有一種溫柔的花,怎麽組織呢,一種方法是從flower繼承,為warmFlower; .... 慎用繼承,因為繼承關系代表著很強烈的一種耦合關系,父類要變了,子類馬上要跟著變;而設計的時候講究高內聚低耦合; 那麽能不能找到一種方式,同時支持在上面兩種維度上的擴展呢? ——橋接模式: 2.橋接模式引入/** * 禮物具體的實現 * @author CY * */ public class GiftImpl extends Gift{ }
Gift:
public class Gift { protected GiftImpl impl; }
Flower:
public class Flower extends GiftImpl{ }View Code
Ring
public class Ring extends GiftImpl{ }View Code
WarmGift:
public class WarmGift extends Gift{ public WarmGift(GiftImpl impl){ this.impl = impl; } }
WildGift:
public class WildGift extends Gift{ public WildGift(GiftImpl impl){ this.impl = impl; } }View Code
Boy:
public class Boy { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void pursue(MM mm){ //Gift g = new WarmGift(new Flower()); //溫暖的花 Gift g = new WildGift(new Ring()); //狂野的戒指 give(g, mm); } public void give(Gift g, MM mm){ } }View Code
感覺有一點繞,需要仔細體會下....
3.小結:
如果在子類的擴展中,有兩個維度,那麽這時候想解耦合,來解決他們的排列組合的問題,這個時候可以用橋接; 橋接模式用的並不是很多;java設計模式-橋接模式