1. 程式人生 > >設計模式 (二十三) 橋樑模式

設計模式 (二十三) 橋樑模式

橋樑模式

橋樑模式的背景: 一個公司生產產品,如果是一個確定的公司,且生產固定的產品。那麼這個類實現起來可能就比較確定,比如這樣:

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("房地產公司賺錢");
	}
}

現在有個賣服裝的,那麼他生產服裝,賣服裝。這樣一個工廠賣的公司是死的,是固定的。 如果再換產品,需要再建個工廠類,從現實意義上講,重建工廠類,就是把以前的廠房都廢棄了,再建立個新廠子,這在實際中是不科學的。

所以,需要進行改進,如何改進?

  1. 工廠和產品進行解藕。
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層時,可以考慮使用橋樑模式