1. 程式人生 > >設計模式之橋模式(Bridge)

設計模式之橋模式(Bridge)

       橋模式就是將抽象與其實現解耦,使他們可以分別獨立的變化,這裡所說的實現並不是我們所瞭解的派生類對抽象類的實現,橋模式中的抽象指的是抽象類及派生類,實現指的是這些抽象類及派生類實現自己的方式。橋模式也是繼承關係的一種替代實現。

 我們來看一個汽車製造商製造汽車的例子,先抽象出汽車模型:

package com.dxy.design.pattern.bridge;

public abstract class Car {
	
	public void produce() {
		
	}
}


貨車類:

package com.dxy.design.pattern.bridge;

public class Truk extends Car {

	@Override
	public void produce() {
	}
	
}


公共汽車類:

package com.dxy.design.pattern.bridge;

public class Bus extends Car {
	
	@Override
	public void produce() {
	}
}


接著我們讓汽車製造商製造汽車:

製造商1製造貨車:

package com.dxy.design.pattern.bridge;

public class FawTruk extends Truk {

	@Override
	public void produce() {
	}
	
}

製造商1製造公共汽車:

package com.dxy.design.pattern.bridge;

public class FawBus extends Truk {

	@Override
	public void produce() {
	}
	
}


這時我們想一下,如果要製造更多的不同種類的車,而不同種類的車又有不同的製造商去製造,這又回到坑爹的多重繼承裡了,這時我們可以通過橋模式將汽車模型的抽象和它的實現解耦合,也就是把車型看做橋模式中的抽象,將製造商看做是橋模式中的實現,就可以避免多重繼承了,抽象的汽車類:

package com.dxy.design.pattern.bridge;

public abstract class Car {
	
	public ManuFacturer mf;
	//將製造商作為引數
	public Car(ManuFacturer mf) {
		this.mf = mf;
	}
	
	public void produce() {
		
	}
}


貨車類:

package com.dxy.design.pattern.bridge;

public class Truk extends Car {
		
	public Truk(ManuFacturer mf) {
		super(mf);
	}

	@Override
	public void produce() {
		mf.produce();
	}
	
}

公共汽車類:

package com.dxy.design.pattern.bridge;

public class Bus extends Car {
		
	public Bus(ManuFacturer mf) {
		super(mf);
	}
	
	@Override
	public void produce() {
		mf.produce();
	}
}



製造商介面:

package com.dxy.design.pattern.bridge;

public interface ManuFacturer {
	
	public void produce() ;
	
}


製造商1:

package com.dxy.design.pattern.bridge;

public class FawTruk implements ManuFacturer  {

	@Override
	public void produce() {
		System.out.println("製造商1製造");
	}
	
}


製造商2:

package com.dxy.design.pattern.bridge;

public class FawBus implements ManuFacturer {

	@Override
	public void produce() {
		System.out.println("製造商2製造");
	}
	
}

這時我們就可以在客戶端將各種汽車和各種製造商任意的組合來避免多重繼承的發生,客戶端呼叫:

package com.dxy.design.pattern.bridge;

public class Client {
	
	public static void main(String[] args) {
		//製造商1製造的火車
		Car car = new Truk(new FawTruk());
		car.produce();
		
		Car car1 = new Bus(new FawBus()) ;
		car1.produce();
		
	}
}


使用Bridge模式,能夠提供比使用繼承關係更靈活的功能,他可以使抽象和實現分開,降低了耦合關係,當有新的抽象和實現方式是,只需要繼承一個抽象和繼承一個實現即可。