1. 程式人生 > >java設計模式-橋接模式

java設計模式-橋接模式

送禮物 one dea setname auth imp ide span pro

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;
    }
    
    public
void pursue(MM mm){ Gift g = new Ring(); give(g, mm); } public void give(Gift g, MM mm){ } }
View Code

MM

技術分享圖片
public class MM {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        
this.name = name; } }
View Code

其他的一些禮物類,都繼承於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.橋接模式引入                      
使用聚合代替繼承; 禮物的具體實現類,GiftImpl.java:
/**
 * 禮物具體的實現
 * @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設計模式-橋接模式