最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計(jì)模式之橋梁(Bridge)模式

 更新時間:2021年05月10日 09:59:13   作者:通信俠  
這篇文章主要介紹了Java設(shè)計(jì)模式之橋梁(Bridge)模式,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)Java設(shè)計(jì)模式的小伙伴們有很好的幫助,需要的朋友可以參考下

橋梁模式的結(jié)構(gòu)

橋梁模式是對象的結(jié)構(gòu)模式。

橋梁模式的示意性系統(tǒng)的結(jié)構(gòu)圖

如上圖所示,系統(tǒng)含有兩個等級結(jié)構(gòu):

  • 由抽象化角色和修正抽象化角色組成的抽象化等級結(jié)構(gòu)。
  • 由實(shí)現(xiàn)化角色和兩個具體實(shí)現(xiàn)化角色所組成的實(shí)現(xiàn)化等級結(jié)構(gòu)。

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

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

對象是對行為的封裝,而行為是由方法實(shí)現(xiàn)的。在這個示意性系統(tǒng)里,抽象化等級結(jié)構(gòu)中的類封裝了operation()方法;而實(shí)現(xiàn)化等級結(jié)構(gòu)中的類封裝的是operationImp()方法。

抽象化等級結(jié)構(gòu)中的商業(yè)方法通過向?qū)?yīng)的實(shí)現(xiàn)化對象的委派實(shí)現(xiàn)自己的功能,這意味著抽象化角色可以通過向不同的實(shí)例化對象委派,來達(dá)到動態(tài)地轉(zhuǎn)換自己的功能的目的。

示意性源碼:

抽象化角色,商業(yè)方法operation()的實(shí)現(xiàn)是通過向?qū)崿F(xiàn)化對象的委派(調(diào)用operationImp()方法)實(shí)現(xiàn)的。

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

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

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

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

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

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

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

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

例子

空中巴士(Airbus)、波音(Boeing)和麥道(McDonnell-Douglas)都是飛機(jī)制造商,它們都生產(chǎn)載客飛機(jī)(Passenger Plane)和載貨飛機(jī)(Cargo Plane)。現(xiàn)在需要設(shè)計(jì)一個系統(tǒng),描述這些飛機(jī)制造商以及它們所制造的飛機(jī)種類。

設(shè)計(jì)方案一

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

這樣設(shè)計(jì)造成具體飛機(jī)與飛機(jī)制造商、飛機(jī)種類之間的耦合過強(qiáng),無法滿足“開-閉原則”:

  • 需要向系統(tǒng)引進(jìn)新的飛機(jī)制造商;
  • 需要向系統(tǒng)引進(jìn)新的飛機(jī)類型。

設(shè)計(jì)方案二

橋梁模式,抽象化角色——飛機(jī)的種類,實(shí)現(xiàn)化角色——飛機(jī)制造商。

在這里插入圖片描述

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

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

示意性源代碼:

抽象化角色類Airplane。

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

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

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í)現(xiàn)化角色是飛機(jī)制造商AirplaneMaker,給出修正抽象化角色所需要實(shí)現(xiàn)的接口。

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

具體實(shí)現(xiàn)化角色是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");
	}
}

客戶端代碼。

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();
	}
}

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

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

相關(guān)文章

  • Springboot中靜態(tài)文件的兩種引入方式總結(jié)

    Springboot中靜態(tài)文件的兩種引入方式總結(jié)

    這篇文章主要介紹了Springboot中靜態(tài)文件的兩種引入方式總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java后端服務(wù)間歇性響應(yīng)慢的問題排查與解決

    Java后端服務(wù)間歇性響應(yīng)慢的問題排查與解決

    之前在公司內(nèi)其它團(tuán)隊(duì)找到幫忙排查的一個后端服務(wù)連接超時問題,問題的表現(xiàn)是服務(wù)部署到線上后出現(xiàn)間歇性請求響應(yīng)非常慢(大于10s),但是后端業(yè)務(wù)分析業(yè)務(wù)日志時卻沒有發(fā)現(xiàn)慢請求,所以本文給大家介紹了Java后端服務(wù)間歇性響應(yīng)慢的問題排查與解決,需要的朋友可以參考下
    2025-03-03
  • Java NumberFormat 類的詳解及實(shí)例

    Java NumberFormat 類的詳解及實(shí)例

    這篇文章主要介紹了Java NumberFormat 類的詳解及實(shí)例的相關(guān)資料,數(shù)字格式化類按照本地風(fēng)格習(xí)慣進(jìn)行的數(shù)字顯示,需要的朋友可以參考下
    2017-08-08
  • Java實(shí)現(xiàn)的兩個線程同時運(yùn)行案例

    Java實(shí)現(xiàn)的兩個線程同時運(yùn)行案例

    這篇文章主要介紹了Java實(shí)現(xiàn)的兩個線程同時運(yùn)行,涉及java多線程相關(guān)操作與使用技巧,需要的朋友可以參考下
    2019-07-07
  • Spring?Boot?+?Mybatis?Plus實(shí)現(xiàn)樹狀菜單的方法

    Spring?Boot?+?Mybatis?Plus實(shí)現(xiàn)樹狀菜單的方法

    這篇文章主要介紹了Spring?Boot?+?Mybatis?Plus實(shí)現(xiàn)樹狀菜單,包括實(shí)體類中添加子菜單列表和集合及構(gòu)建菜單樹的詳細(xì)代碼,代碼簡單易懂,需要的朋友可以參考下
    2021-12-12
  • skywalking源碼解析javaAgent工具ByteBuddy應(yīng)用

    skywalking源碼解析javaAgent工具ByteBuddy應(yīng)用

    這篇文章主要為大家介紹了skywalking源碼解析javaAgent工具ByteBuddy應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-03-03
  • Java解壓zip文件完整代碼分享

    Java解壓zip文件完整代碼分享

    這篇文章主要介紹了Java解壓zip文件完整代碼分享,向大家分享了兩部分代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • springboot+vue?若依項(xiàng)目在windows2008R2企業(yè)版部署流程分析

    springboot+vue?若依項(xiàng)目在windows2008R2企業(yè)版部署流程分析

    這篇文章主要介紹了springboot+vue?若依項(xiàng)目在windows2008R2企業(yè)版部署流程,本次使用jar包啟動后端,故而準(zhǔn)備打包后的jar文件,需要的朋友可以參考下
    2022-12-12
  • Java中ArrayList集合的常用方法大全

    Java中ArrayList集合的常用方法大全

    這篇文章主要給大家介紹了關(guān)于Java中ArrayList集合的常用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 詳解spring boot集成RabbitMQ

    詳解spring boot集成RabbitMQ

    RabbitMQ作為AMQP的代表性產(chǎn)品,在項(xiàng)目中大量使用。結(jié)合現(xiàn)在主流的spring boot,極大簡化了開發(fā)過程中所涉及到的消息通信問題。
    2017-03-03

最新評論

达日县| 阳泉市| 射阳县| 平潭县| 延寿县| 琼结县| 庆安县| 合水县| 文昌市| 肃南| 东海县| 泸州市| 穆棱市| 苍溪县| 桐乡市| 衡山县| 南皮县| 如东县| 岳池县| 宝鸡市| 贵南县| 崇文区| 柏乡县| 湖口县| 望城县| 玉林市| 建始县| 贺兰县| 贵德县| 子洲县| 芒康县| 锦屏县| 九龙坡区| 资阳市| 高要市| 静海县| 敦煌市| 临高县| 东山县| 和龙市| 平安县|