桥梁设计模式示例
本文是我們名為“ Java設計模式 ”的學院課程的一部分。
在本課程中,您將深入研究大量的設計模式,并了解如何在Java中實現和利用它們。 您將了解模式如此重要的原因,并了解何時以及如何應用模式中的每一個。 在這里查看 !
目錄
1.簡介 2.什么是橋接模式 3.解決問題 4.橋接模式的使用 5.下載源代碼1.簡介
Sec Security System是一家安全和電子公司,生產和組裝汽車產品。 它提供所需的任何汽車電子或安全系統,從安全氣囊到GPS跟蹤系統,倒車停車系統等。大型汽車公司在其汽車中使用其產品。 該公司使用定義明確的面向對象方法,使用僅由他們開發和維護的軟件來跟蹤其產品。 他們得到汽車,為其生產系統并將其組裝到汽車中。
最近,他們從BigWheel(汽車公司)獲得了新訂單,為他們的新xz模型生產中央鎖和齒輪鎖系統。 為此,他們正在創建一個新的軟件系統。 他們首先創建了一個新的抽象類CarProductSecurity,在其中保留了一些特定于汽車的方法和一些他們認為對所有安全產品都通用的功能。 然后,他們擴展了該類并創建了兩個不同的子類,分別稱為BigWheelXZCentralLocking和BigWheelXZGearLocking。 類圖如下所示:
圖1
不久后,另一家汽車公司Motoren要求他們為其lm模型生產一種新的中央鎖和齒輪鎖系統。 由于不能在不同汽車的兩種型號中都使用相同的安全系統,因此Sec安全系統已為其生產了新系統,并且還為MotorenLMCentralLocking和MotorenLMGearLocking創建了新類,這些類也擴展了CarProductSecurity類。
現在,新的類圖如下所示:
圖2
到目前為止,一切都很好,但是如果另一家汽車公司需要另一套新的中央鎖定和齒輪鎖定系統,會發生什么呢? 一個需要為其創建另外兩個新類。 這種設計將為每個系統創建一個類別,或者更糟的是,如果為這兩個汽車公司中的每個公司都生產倒車停車系統,則將為每個汽車公司另外創建兩個新類別。
子類過多的設計不靈活,難以維護。 繼承還將實現永久地綁定到抽象上,這使得很難獨立地修改,擴展和重用抽象和實現。
請注意,汽車和產品應獨立變化,以使軟件系統易于擴展和重用。
橋接設計模式可以解決此問題,但是在此之前,讓我們首先了解有關橋接模式的一些細節。
2.什么是橋接模式
橋接模式的目的是將抽象與其實現分離,以便兩者可以獨立變化。 它將抽象和實現放入兩個不同的類層次結構中,以便可以獨立地擴展兩者。
圖3
橋接模式的組件包括一個抽象,完善的抽象,一個實現程序和具體的實現程序。
抽象定義了抽象的接口,還維護了對類型實現者對象的引用,抽象和實現者之間的鏈接稱為橋。
精致抽象擴展了抽象定義的接口。
實現者為實現類(具體的實現者)提供接口。
然后,具體實施者實現實施者接口并定義其具體實施。
橋接模式將接口與實現分離。 結果,實現未永久綁定到接口。 可以在運行時配置抽象的實現。 它還消除了對實現的編譯時依賴性。 更改實現類不需要重新編譯抽象類及其客戶端。 客戶端只需要了解抽象,就可以對它們隱藏實現。
3.解決問題
除了在上面討論的問題中為每種汽車模型的每種產品創建子類之外,我們還可以將設計分成兩個不同的層次結構。 一個接口用于產品,該接口將用作實施者,另一個接口是汽車類型的抽象。 實施者將由具體實施者實施,并為其提供實施。 另一方面,將通過更精細的抽象來擴展抽象。
圖4
package com.javacodegeeks.patterns.bridgepattern;public interface Product {public String productName();public void produce(); }實現者Product具有方法produce() ,具體實現者將使用該方法為其提供具體功能。 該方法將生成產品的基本模型,在對該汽車模型進行特定修改之后,該模型可以與任何汽車模型一起使用。
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");}}兩種不同的具體實現者為Product實現者提供實現。
現在是抽象類,即Car類,其中包含產品類型的引用,并提供了兩種抽象方法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()提供具體而具體的實現。
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);}}現在,讓我們測試示例。
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();}}上面的示例將產生以下輸出:
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.橋接模式的使用
在以下情況下,您應該使用橋接模式:
5.下載源代碼
這是關于橋梁模式的課程。 您可以在此處下載源代碼: BridgePattern-Project
翻譯自: https://www.javacodegeeks.com/2015/09/bridge-design-pattern.html
總結
- 上一篇: linux Mpi安装(linux mp
- 下一篇: linux触屏切换图片代码(linux