設計模式 (二十三) 橋樑模式
阿新 • • 發佈:2018-11-09
橋樑模式
橋樑模式的背景: 一個公司生產產品,如果是一個確定的公司,且生產固定的產品。那麼這個類實現起來可能就比較確定,比如這樣:
public abstract class corp{ protected abstract void produce(); protected abstract void sell(); public void makeMoney(){ this.produce(); this.sell(); } } public class HouseCorp extends Corp{ @Override protected void produce(){ System.out.println("房地產公司蓋房"); } @Override protected void sell(){ System.out.println("賣房"); } @Override public void makeMoney(){ super.makeMoney(); System.out.println("房地產公司賺錢"); } }
現在有個賣服裝的,那麼他生產服裝,賣服裝。這樣一個工廠賣的公司是死的,是固定的。 如果再換產品,需要再建個工廠類,從現實意義上講,重建工廠類,就是把以前的廠房都廢棄了,再建立個新廠子,這在實際中是不科學的。
所以,需要進行改進,如何改進?
- 工廠和產品進行解藕。
public abstract class Product{ public abstract void beProducted(); public abstract void beSelled(); } public class House extends Product{ @Override public void beProducted(){ System.out.println("生產出的房子"); } @Override public void beSelled(){ System.out.println("生產出的房子賣出去了"); } } public class Ipod extends Product{ @Override public void beProducted(){ System.out.println("生產賣ipod"); } @Override public void beSelled(){ System.out.println("賣了ipod"); } }
這樣是一個product產品類
再來看公司類,以前公司是生產產品固定的。
現在要解藕了
public abstract class Corp{ private Product product; public Corp(Product product){ this.product=product; } public void makeMoney(){ this.product.beProducted(); this.product.beSelled(); } } public class HouseCorp extends Corp{ public HouseCorp(House house){ super(house); } @Override public void makeMoney(){ super.makeMoney(); System.out.println("房地產公司掙錢"); } }
這樣工廠和產品就解藕了。 一個工廠可以生產多個產品了。
只要新建並傳進去不同的產品類就可以了。
橋樑模式 的類圖
橋樑模式的角色:
- Abstraction。 抽象化角色。 主要職責是定義該角色的行為,同時儲存一個實現化角色的引用。該角色一般是抽象類。
- Implementor。 實現化角色。 是介面或是抽象類。定義角色需要的行為和屬性。
- RefinedAbstraction。 修正抽象化角色。 引用實現化角色對抽象化角色進行修正。
- ConcreteImplementor。 具體實現化角色。 實現介面或抽象類定義的方法和屬性。
public interface Implementor{
public void doSomething();
public void doAnything();
}
public class ConcreteImplementor1 implements Implementor{
public void doSomething(){}
public void doAnything(){}
}
public class ConcreteImplementor2 implements Implementor{
public void doSomething(){}
public void doAnything(){}
}
public abstract class Abstraction{
private Implementor imp;
public Abstraction(Implementor imp){
this.imp=imp;
}
public void request(){
this.imp.doSomething();
}
public Implementor getImp(){
return imp;
}
}
public class RefinedAbstraction extends Abstraction{
private Implementor imp;
public RefinedAbstraction(Implementor imp){
super(imp);
}
public void request(){
super.request();
super.getImp().doAnything();
}
}
public class Client{
public static void main(String[] args){
Implementor imp=new ConcreteImplementor1();
Abstraction abs=new RefinedAbstraction(imp);
abs.request();
}
}
橋樑模式的優點
- 抽象和實現分離。 橋樑模式的主要特點就是抽象和實現分離。它完全是解決繼承的缺點而提出的設計模式,在此模式下,實現可以不受抽象的約束,不用再繫結在一個固定的抽象層次上。
- 優秀的擴充能力。
- 實現細節對客戶透明。
橋樑模式的使用場景
- 不希望或不適合使用繼承的場景
- 介面或抽象類不穩定的場景
- 重用性要求較高的場景
橋樑模式的注意事項
- 橋樑模式比較簡單,主要應該考慮的是如何拆分抽象和實現。 當在一個系統設計時,發現類的繼承有N層時,可以考慮使用橋樑模式