java 设计模式之桥梁模式

栏目: 后端 · 发布时间: 5年前

内容简介:SEC安全系统是一家生产和组装汽车产品的安全和电子公司。它提供任何你想要的汽车电子或安全系统,从安全气囊到GPS跟踪系统,倒车停车系统等。大型汽车公司在他们的汽车中使用它的产品。公司使用一种定义良好的面向对象的方法,使用他们开发和维护的软件来跟踪他们的产品。他们得到汽车,为它生产系统,然后把它组装到汽车上。最近,他们接到了Bigwheel(一家汽车公司)的新订单,为他们的新XZ车型生产中控锁和齿轮锁系统。为了维护这一点,他们正在创建一个新的软件系统。他们首先创建了一个新的抽象类过了一会儿,另一家汽车公司Mo

SEC安全系统是一家生产和组装汽车产品的安全和电子公司。它提供任何你想要的汽车电子或安全系统,从安全气囊到GPS跟踪系统,倒车停车系统等。大型汽车公司在他们的汽车中使用它的产品。公司使用一种定义良好的面向对象的方法,使用他们开发和维护的软件来跟踪他们的产品。他们得到汽车,为它生产系统,然后把它组装到汽车上。

最近,他们接到了Bigwheel(一家汽车公司)的新订单,为他们的新XZ车型生产中控锁和齿轮锁系统。为了维护这一点,他们正在创建一个新的软件系统。他们首先创建了一个新的抽象类 CarProductSecurity ,在这个类中保留了一些特定于汽车的方法和一些他们认为对所有安全产品都通用的特性。然后他们扩展了类并创建了两个不同的子类,分别命名为 BigWheelXZCentralLockingBigWheelXZGearLocking 。类图如下所示:

java 设计模式之桥梁模式

过了一会儿,另一家汽车公司Motoren要求他们为他们的LM车型生产一种新的中控锁和齿轮锁系统。由于相同的安全系统不能用于不同车型的两种车型,因此SEC安全系统已经为它们生产了新的系统,并已创建了新的等级 MotorEnlmCentrallockingMotorEnlmGearLocking ,这也扩展了 CarProductSecurity 等级。 现在,新的类图如下所示:

java 设计模式之桥梁模式

到目前为止还不错,但如果另一家汽车公司需要另一套新的中控锁和齿轮锁系统,会发生什么呢?一个需要为它创建另外两个新类。这种设计将为每个系统创建一个类,或者更糟的是,如果为这两个汽车公司中的每一个生产反向停车系统,则将为每个公司再创建两个新类。

子类太多的设计不灵活,难以维护。继承还将实现永久绑定到抽象,这使得独立地修改、扩展和重用抽象和实现变得困难。

请注意,为了使软件系统易于扩展和重用,汽车和产品应独立变化。

桥梁 设计模式 可以解决这个问题,但在此之前,让我们先了解一些关于桥梁模式的细节。

2.什么是桥梁模式

桥梁模式的目的是将抽象从其实现中分离出来,这样两个抽象就可以独立变化。它将抽象和实现放在两个不同的类层次结构中,以便两者都可以独立扩展。

java 设计模式之桥梁模式

桥梁的组成部分包括抽象、精抽象、实现者和具体实现者。 抽象定义了抽象的接口,还维护了对类型为实现者的对象的引用,抽象和实现者之间的链接称为桥。

3.实例

在上面讨论的问题中,我们不需要为每个汽车模型的每个产品创建子类,而是可以将设计分为两个不同的层次结构。一个接口用于将用作实现者的产品,另一个接口将是汽车类型的抽象。实现者将由具体的实现者实现,并为其提供实现。另一方面,抽象将通过更精细的抽象来扩展。

java 设计模式之桥梁模式
package com.javacodegeeks.patterns.bridgepattern;
public interface Product {
    public String productName();
    public void produce();
}
复制代码

实现者产品有一个方法product(),具体实现者将使用该方法为其提供具体的功能。该方法将生成产品的基本模型,经过特定于该车型的一些修改后,可以与任何车型一起使用。

package com.javacodegeeks.patterns.bridgepattern;
public class CentralLocking implements Product{
    private final String productName;
    public CentralLocking(String productName){
        this.productName = productName;
    }
    @Override
    public String productName() {
        return productName;
    }
    @Override
    public 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;
    }
    @Override
    public String productName() {
        return productName;
    }
    @Override
    public void produce() {
        System.out.println("Producing Gear Locking System");
    }
}
复制代码

两个不同的具体实现者为产品实现者提供实现。 现在抽象Car类,它保存了产品类型的引用,并提供了两个抽象方法 produceproduct()assembly()

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的子类将为 assembly()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;
    }
 
    @Override
    public void assemble() {
        System.out.println("Assembling "+product.productName()+" for "+carType);
    }
 
    @Override
    public 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;
    }
 
    @Override
    public void assemble() {
        System.out.println("Assembling "+product.productName()+" for "+carType);
    }
 
    @Override
    public 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 System
 
Producing 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 System
 
Producing 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 System
复制代码

以上所述就是小编给大家介绍的《java 设计模式之桥梁模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

电子邮件营销密码

电子邮件营销密码

[美] Jeanniey Mullen、David Daniesl / 薛剑韬 / 人民邮电出版社 / 2009-9 / 39.00元

在当今互联网蓬勃发展的形势下,电子邮件是互联网应用最广的服务之一。那么如何利用其作为有效的营销工具呢?本书系统地讲解了美国电子邮件营销的预算统筹、营销策略、管理模式、执行机制、涉及的技术、营销实施的细节等,其方法有很强的可循性,并可预见将获得的成果。阅读本书之后,读者会深刻感受到电子邮件营销的博大精深,它既是一门扎实严谨的科学,又是一项充满创造力的艺术。. 本书适合企业管理人员及市场营销人员......一起来看看 《电子邮件营销密码》 这本书的介绍吧!

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具