桥梁设计模式示例
本文是我們名為“ Java設(shè)計模式 ”的學(xué)院課程的一部分。
在本課程中,您將深入研究大量的設(shè)計模式,并了解如何在Java中實(shí)現(xiàn)和利用它們。 您將了解模式如此重要的原因,并了解何時以及如何應(yīng)用模式中的每一個。 在這里查看 !
目錄
1.簡介 2.什么是橋接模式 3.解決問題 4.橋接模式的使用 5.下載源代碼1.簡介
Sec Security System是一家安全和電子公司,生產(chǎn)和組裝汽車產(chǎn)品。 它提供所需的任何汽車電子或安全系統(tǒng),從安全氣囊到GPS跟蹤系統(tǒng),倒車停車系統(tǒng)等。大型汽車公司在其汽車中使用其產(chǎn)品。 該公司使用定義明確的面向?qū)ο蠓椒?#xff0c;使用僅由他們開發(fā)和維護(hù)的軟件來跟蹤其產(chǎn)品。 他們得到汽車,為其生產(chǎn)系統(tǒng)并將其組裝到汽車中。
最近,他們從BigWheel(汽車公司)獲得了新訂單,為他們的新xz模型生產(chǎn)中央鎖和齒輪鎖系統(tǒng)。 為此,他們正在創(chuàng)建一個新的軟件系統(tǒng)。 他們首先創(chuàng)建了一個新的抽象類CarProductSecurity,在其中保留了一些特定于汽車的方法和一些他們認(rèn)為對所有安全產(chǎn)品都通用的功能。 然后,他們擴(kuò)展了該類并創(chuàng)建了兩個不同的子類,分別稱為BigWheelXZCentralLocking和BigWheelXZGearLocking。 類圖如下所示:
圖1
不久后,另一家汽車公司Motoren要求他們?yōu)槠鋖m模型生產(chǎn)一種新的中央鎖和齒輪鎖系統(tǒng)。 由于不能在不同汽車的兩種型號中都使用相同的安全系統(tǒng),因此Sec安全系統(tǒng)已為其生產(chǎn)了新系統(tǒng),并且還為MotorenLMCentralLocking和MotorenLMGearLocking創(chuàng)建了新類,這些類也擴(kuò)展了CarProductSecurity類。
現(xiàn)在,新的類圖如下所示:
圖2
到目前為止,一切都很好,但是如果另一家汽車公司需要另一套新的中央鎖定和齒輪鎖定系統(tǒng),會發(fā)生什么呢? 一個需要為其創(chuàng)建另外兩個新類。 這種設(shè)計將為每個系統(tǒng)創(chuàng)建一個類別,或者更糟的是,如果為這兩個汽車公司中的每個公司都生產(chǎn)倒車停車系統(tǒng),則將為每個汽車公司另外創(chuàng)建兩個新類別。
子類過多的設(shè)計不靈活,難以維護(hù)。 繼承還將實(shí)現(xiàn)永久地綁定到抽象上,這使得很難獨(dú)立地修改,擴(kuò)展和重用抽象和實(shí)現(xiàn)。
請注意,汽車和產(chǎn)品應(yīng)獨(dú)立變化,以使軟件系統(tǒng)易于擴(kuò)展和重用。
橋接設(shè)計模式可以解決此問題,但是在此之前,讓我們首先了解有關(guān)橋接模式的一些細(xì)節(jié)。
2.什么是橋接模式
橋接模式的目的是將抽象與其實(shí)現(xiàn)分離,以便兩者可以獨(dú)立變化。 它將抽象和實(shí)現(xiàn)放入兩個不同的類層次結(jié)構(gòu)中,以便可以獨(dú)立地擴(kuò)展兩者。
圖3
橋接模式的組件包括一個抽象,完善的抽象,一個實(shí)現(xiàn)程序和具體的實(shí)現(xiàn)程序。
抽象定義了抽象的接口,還維護(hù)了對類型實(shí)現(xiàn)者對象的引用,抽象和實(shí)現(xiàn)者之間的鏈接稱為橋。
精致抽象擴(kuò)展了抽象定義的接口。
實(shí)現(xiàn)者為實(shí)現(xiàn)類(具體的實(shí)現(xiàn)者)提供接口。
然后,具體實(shí)施者實(shí)現(xiàn)實(shí)施者接口并定義其具體實(shí)施。
橋接模式將接口與實(shí)現(xiàn)分離。 結(jié)果,實(shí)現(xiàn)未永久綁定到接口。 可以在運(yùn)行時配置抽象的實(shí)現(xiàn)。 它還消除了對實(shí)現(xiàn)的編譯時依賴性。 更改實(shí)現(xiàn)類不需要重新編譯抽象類及其客戶端。 客戶端只需要了解抽象,就可以對它們隱藏實(shí)現(xiàn)。
3.解決問題
除了在上面討論的問題中為每種汽車模型的每種產(chǎn)品創(chuàng)建子類之外,我們還可以將設(shè)計分成兩個不同的層次結(jié)構(gòu)。 一個接口用于產(chǎn)品,該接口將用作實(shí)施者,另一個接口是汽車類型的抽象。 實(shí)施者將由具體實(shí)施者實(shí)施,并為其提供實(shí)施。 另一方面,將通過更精細(xì)的抽象來擴(kuò)展抽象。
圖4
package com.javacodegeeks.patterns.bridgepattern;public interface Product {public String productName();public void produce(); }實(shí)現(xiàn)者Product具有方法produce() ,具體實(shí)現(xiàn)者將使用該方法為其提供具體功能。 該方法將生成產(chǎn)品的基本模型,在對該汽車模型進(jìn)行特定修改之后,該模型可以與任何汽車模型一起使用。
package com.javacodegeeks.patterns.bridgepattern;public class CentralLocking implements Product{private final String productName;public CentralLocking(String productName){this.productName = productName;}@Overridepublic String productName() {return productName;}@Overridepublic void produce() {System.out.println("Producing Central Locking System");}}package com.javacodegeeks.patterns.bridgepattern;public class GearLocking implements Product{private final String productName;public GearLocking(String productName){this.productName = productName;}@Overridepublic String productName() {return productName;}@Overridepublic void produce() {System.out.println("Producing Gear Locking System");}}兩種不同的具體實(shí)現(xiàn)者為Product實(shí)現(xiàn)者提供實(shí)現(xiàn)。
現(xiàn)在是抽象類,即Car類,其中包含產(chǎn)品類型的引用,并提供了兩種抽象方法produceProduct()和assemble() 。
package com.javacodegeeks.patterns.bridgepattern;public abstract class Car {private final Product product;private final String carType;public Car(Product product,String carType){this.product = product;this.carType = carType;}public abstract void assemble();public abstract void produceProduct();public void printDetails(){System.out.println("Car: "+carType+", Product:"+product.productName());} }Car的子類將為方法assemble()和produceProduct()提供具體而具體的實(shí)現(xiàn)。
package com.javacodegeeks.patterns.bridgepattern;public class BigWheel extends Car{private final Product product;private final String carType;public BigWheel(Product product, String carType) {super(product, carType);this.product = product;this.carType = carType;}@Overridepublic void assemble() {System.out.println("Assembling "+product.productName()+" for "+carType);}@Overridepublic void produceProduct() {product.produce();System.out.println("Modifing product "+product.productName()+" according to "+carType);}}package com.javacodegeeks.patterns.bridgepattern;public class Motoren extends Car{private final Product product;private final String carType;public Motoren(Product product, String carType) {super(product, carType);this.product = product;this.carType = carType;}@Overridepublic void assemble() {System.out.println("Assembling "+product.productName()+" for "+carType);}@Overridepublic void produceProduct() {product.produce();System.out.println("Modifing product "+product.productName()+" according to "+carType);}}現(xiàn)在,讓我們測試示例。
package com.javacodegeeks.patterns.bridgepattern;public class TestBridgePattern {public static void main(String[] args) {Product product = new CentralLocking("Central Locking System");Product product2 = new GearLocking("Gear Locking System");Car car = new BigWheel(product , "BigWheel xz model");car.produceProduct();car.assemble();car.printDetails();System.out.println();car = new BigWheel(product2 , "BigWheel xz model");car.produceProduct();car.assemble();car.printDetails();System.out.println("-----------------------------------------------------");car = new Motoren(product, "Motoren lm model");car.produceProduct();car.assemble();car.printDetails();System.out.println();car = new Motoren(product2, "Motoren lm model");car.produceProduct();car.assemble();car.printDetails();}}上面的示例將產(chǎn)生以下輸出:
Producing Central Locking System Modifing product Central Locking System according to BigWheel xz model Assembling Central Locking System for BigWheel xz model Car: BigWheel xz model, Product:Central Locking SystemProducing Gear Locking System Modifing product Gear Locking System according to BigWheel xz model Assembling Gear Locking System for BigWheel xz model Car: BigWheel xz model, Product:Gear Locking System ----------------------------------------------------- Producing Central Locking System Modifing product Central Locking System according to Motoren lm model Assembling Central Locking System for Motoren lm model Car: Motoren lm model, Product:Central Locking SystemProducing Gear Locking System Modifing product Gear Locking System according to Motoren lm model Assembling Gear Locking System for Motoren lm model Car: Motoren lm model, Product:Gear Locking System4.橋接模式的使用
在以下情況下,您應(yīng)該使用橋接模式:
5.下載源代碼
這是關(guān)于橋梁模式的課程。 您可以在此處下載源代碼: BridgePattern-Project
翻譯自: https://www.javacodegeeks.com/2015/09/bridge-design-pattern.html
總結(jié)
- 上一篇: linux Mpi安装(linux mp
- 下一篇: 状态设计模式示例