国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java設計模式之橋梁(Bridge)模式

發(fā)布時(shí)間:2021-07-06 11:13 來(lái)源:腳本之家 閱讀:0 作者:通信俠 欄目: 開(kāi)發(fā)技術(shù)

橋梁模式的結構

橋梁模式是對象的結構模式。

如上圖所示,系統含有兩個(gè)等級結構:

  • 由抽象化角色和修正抽象化角色組成的抽象化等級結構。
  • 由實(shí)現化角色和兩個(gè)具體實(shí)現化角色所組成的實(shí)現化等級結構。

橋梁模式所涉及的角色有:

  • 抽象化(Abstraction)角色:抽象化給出的定義,并保存一個(gè)對實(shí)現化對象的引用。
  • 修正抽象(Refined Abstraction)化角色:擴展抽象化角色,改變和修正父類(lèi)對抽象化的定義。
  • 實(shí)現化(Implementor)角色:這個(gè)角色給出實(shí)現化角色的接口,但不給出具體的實(shí)現。必須指出的是,這個(gè)接口不一定和抽象化角色的接口定義相同,實(shí)際上,這兩個(gè)接口可以非常不一樣。 實(shí)現化角色應當只給出底層操作,而抽象化角色應當只給出基于底層操作的更高一層的操作。
  • 具體實(shí)現化(Concrete Implementor)角色:這個(gè)角色給出實(shí)現化角色接口的具體實(shí)現。

對象是對行為的封裝,而行為是由方法實(shí)現的。在這個(gè)示意性系統里,抽象化等級結構中的類(lèi)封裝了operation()方法;而實(shí)現化等級結構中的類(lèi)封裝的是operationImp()方法。

抽象化等級結構中的商業(yè)方法通過(guò)向對應的實(shí)現化對象的委派實(shí)現自己的功能,這意味著(zhù)抽象化角色可以通過(guò)向不同的實(shí)例化對象委派,來(lái)達到動(dòng)態(tài)地轉換自己的功能的目的。

示意性源碼:

抽象化角色,商業(yè)方法operation()的實(shí)現是通過(guò)向實(shí)現化對象的委派(調用operationImp()方法)實(shí)現的。

abstract public class Abstraction {
	protected Implementor imp;
	/**
	 * 某個(gè)商業(yè)方法
	 */
	public void operation() {
		imp.operationImp();
	}
}

修正抽象化角色,商業(yè)方法被置換掉了。

public class RefinedAbstraction extends Abstraction {
	/**
	 * 某個(gè)商業(yè)方法在修正抽象化角色的實(shí)現
	 */
	public void operation() {
		// improved logic
	}
}

實(shí)現化角色抽象類(lèi)Implementor中聲明一個(gè)抽象方法operationImp(),這個(gè)方法必須由具體子類(lèi)實(shí)現。

abstract public class Implementor {
	/**
	 * 某個(gè)商業(yè)方法的實(shí)現化聲明
	 */
	public abstract void operationImp();
}

具體實(shí)現化角色實(shí)現了抽象類(lèi)Implementor所聲明的商業(yè)方法operationImp()。

public class ConcreteImplementorA extends Implementor {
	/**
	 * 某個(gè)商業(yè)方法的實(shí)現化實(shí)現
	 */
	public void operationImp() {
		System.out.println("Do something...");
	}
}

一般而言,實(shí)現化角色中的每一個(gè)方法都應當有一個(gè)抽象化角色中的某一個(gè)方法與之相對應,但是,反過(guò)來(lái)則不一定。換言之,抽象化角色的接口比實(shí)現化角色的接口寬。抽象化角色除了提供與實(shí)現化角色相關(guān)的方法之外,還有可能提供其他的商業(yè)方法;而實(shí)現化角色則往往僅為實(shí)現抽象化角色的相關(guān)行為而存在。

例子

空中巴士(Airbus)、波音(Boeing)和麥道(McDonnell-Douglas)都是飛機制造商,它們都生產(chǎn)載客飛機(Passenger Plane)和載貨飛機(Cargo Plane)?,F在需要設計一個(gè)系統,描述這些飛機制造商以及它們所制造的飛機種類(lèi)。

設計方案一

在這個(gè)設計方案里,有兩個(gè)子接口:客機和貨機。所有的具體飛機又都要繼承自Airbus,Boeing和MD等超類(lèi)。這樣一來(lái),每一個(gè)具體飛機都帶有兩個(gè)超類(lèi)型:飛機制造商類(lèi)型,客、貨機類(lèi)型。

這樣設計造成具體飛機與飛機制造商、飛機種類(lèi)之間的耦合過(guò)強,無(wú)法滿(mǎn)足“開(kāi)-閉原則”:

  • 需要向系統引進(jìn)新的飛機制造商;
  • 需要向系統引進(jìn)新的飛機類(lèi)型。

設計方案二

橋梁模式,抽象化角色——飛機的種類(lèi),實(shí)現化角色——飛機制造商。

客機和貨機經(jīng)過(guò)一個(gè)飛機的“轉世”橋梁,可以分別“投胎”到空中巴士、波音和麥道等飛機制造商哪里,“出生”為不同牌子的飛機。

由于這個(gè)“轉世”橋梁實(shí)際上是一個(gè)聚合關(guān)系,因此可以動(dòng)態(tài)地變化。所以如果系統需要加入新的飛機種類(lèi)或者飛機制造商的話(huà),已有的各個(gè)角色不必改變,需要改變的僅僅是一個(gè)多態(tài)性的聚合關(guān)系。

示意性源代碼:

抽象化角色類(lèi)Airplane。

abstract public class Airplane {
	protected AirplaneMaker airplaneMaker;
	abstract public void fly();
	
	protected Airplane(AirplaneMaker airplaneMaker) {
		this.airplaneMaker = airplaneMaker;
	}
}

載客飛機和載貨飛機屬于修正抽象化角色。

public class PassengerPlane extends Airplane {
	public void fly() {
		// Write your code here
		airplaneMaker.produce();
	}
	
	public PassengerPlane(AirplaneMaker airplaneMaker) {
		super(airplaneMaker);
	}
}

public class CargoPlane extends Airplane {
	public void fly() {
		// Write your code here
		airplaneMaker.produce();
	}
	
	public CargoPlane(AirplaneMaker airplaneMaker) {
		super(airplaneMaker);
	}
}

實(shí)現化角色是飛機制造商AirplaneMaker,給出修正抽象化角色所需要實(shí)現的接口。

abstract public class AirplaneMaker {
	abstract public void produce();
}

具體實(shí)現化角色是Airbus、Boeing、MD。

public class Airbus extends AirplaneMaker {
	public void produce() {
		// Write your code here
		System.out.println("produce by Airbus");
	}
}

public class Boeing extends AirplaneMaker {
	public void produce() {
		// Write your code here
		System.out.println("produce by Boeing");
	}
}

public class MD extends AirplaneMaker {
	public void produce() {
		// Write your code here
		System.out.println("produce by MD");
	}
}

客戶(hù)端代碼。

public class BridgePatternDemo {
	public static void main(String[] args) {
		Airplane mdPassengerPlane = new PassengerPlane(new MD());
		Airplane mdCargoPlane = new CargoPlane(new MD());		
		mdPassengerPlane.fly();
		mdCargoPlane.fly();
		
		Airplane boeingPassengerPlane = new PassengerPlane(new Boeing());
		Airplane boeingCargoPlane = new CargoPlane(new Boeing());
		boeingPassengerPlane.fly();
		boeingCargoPlane.fly();
	}
}

現在,如果需要增加新的飛機制造商或者新的飛機種類(lèi),只需要向系統引進(jìn)一個(gè)新的修正抽象化角色或者一個(gè)新的具體實(shí)現化角色即可。即系統的功能可以在不修改已有代碼的情況下得到擴展,符合“開(kāi)-閉”原則。

到此這篇關(guān)于Java設計模式之橋梁(Bridge)模式的文章就介紹到這了,更多相關(guān)Java 橋梁模式內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

香港三日本三级少妇三级99| 97视频在线精品国自产拍| AV区无码字幕中文色| 中文字幕一区日韩精品| 国产成人无码VA在线观看| 久久久久久综合网天天|