【Java教程】Day20-07 设计模式:结构型模式——桥接模式

1. 桥接模式概述

桥接模式(Bridge Pattern)是一种结构型设计模式,它通过将抽象部分与其实现部分分离,使得两者可以独立地变化。简单来说,桥接模式让不同的实现和抽象部分可以独立扩展,从而避免了类继承体系的“爆炸式增长”。

2. 桥接模式的实际问题

我们首先通过一个现实中的例子来理解桥接模式的必要性。

假设有一个汽车厂商生产三种品牌的汽车,分别是:BigTiny 和 Boss,每种品牌可以选择不同的发动机类型,如:燃油引擎电动引擎混合动力引擎。如果使用传统的继承结构来表示每种品牌和发动机的组合,那么类的数量将会急剧增加,如下图所示:


 

 

markdown                   ┌───────┐                   │  Car  │                   └───────┘    ┌──────────────────┼───────────────────┐    │                  │                   │┌───────┐          ┌───────┐          ┌───────┐│BigCar │          │TinyCar│          │BossCar│└───────┘          └───────┘          └───────┘    ▲                  ▲                  ▲    │                  │                  │    │ ┌───────────────┐│ ┌───────────────┐│ ┌───────────────┐    ├─│  BigFuelCar   │├─│  TinyFuelCar  │├─│  BossFuelCar  │    │ └───────────────┘│ └───────────────┘│ └───────────────┘    │ ┌───────────────┐│ ┌───────────────┐│ ┌───────────────┐    ├─│BigElectricCar │├─│TinyElectricCar│├─│BossElectricCar│    │ └───────────────┘│ └───────────────┘│ └───────────────┘    │ ┌───────────────┐│ ┌───────────────┐│ ┌───────────────┐    └─│ BigHybridCar  │└─│ TinyHybridCar │└─│ BossHybridCar │      └───────────────┘  └───────────────┘  └───────────────┘

 

如果在未来需要新增一个品牌或引擎类型,这种继承方式将导致类的数量迅速增加,难以维护。

3. 如何通过桥接模式解决这一问题

桥接模式的核心思想是将抽象部分与实现部分分离开来,使得它们可以独立扩展。在上面的汽车例子中,我们将“品牌”部分抽象成不同的子类,将“引擎类型”部分作为独立的接口进行设计。这样,品牌和引擎就能独立扩展,无需直接使用继承。

4. 桥接模式的实现

4.1 定义抽象类 Car

首先,我们定义一个抽象类 Car,它持有一个 Engine 引擎:


 

 

javapublic abstract class Car {    // 引用 Engine 接口    protected Engine engine;    public Car(Engine engine) {        this.engine = engine;    }    public abstract void drive();}

 

4.2 定义引擎接口 Engine

接着,我们定义一个 Engine 接口,表示不同类型的引擎:


 

 

javapublic interface Engine {    void start();}

 

4.3 实现具体的引擎类型

根据不同的发动机类型,实现相应的 Engine 接口。例如:


 

 

javapublic class FuelEngine implements Engine {    public void start() {        System.out.println("Starting Fuel Engine...");    }}public class ElectricEngine implements Engine {    public void start() {        System.out.println("Starting Electric Engine...");    }}public class HybridEngine implements Engine {    public void start() {        System.out.println("Starting Hybrid Engine...");    }}

 

4.4 定义品牌的抽象类 RefinedCar

接下来,我们定义一个 RefinedCar 类来代表具体的品牌,例如:BossCarTinyCar 等,这些类继承自 Car 类,并通过组合的方式使用不同类型的 Engine


 

 

javapublic abstract class RefinedCar extends Car {    public RefinedCar(Engine engine) {        super(engine);    }    public void drive() {        this.engine.start();        System.out.println("Driving " + getBrand() + " car...");    }    public abstract String getBrand();}

 

4.5 实现具体品牌的汽车类

现在,我们可以为每种品牌实现一个具体的 RefinedCar 类。例如:


 

 

javapublic class BossCar extends RefinedCar {    public BossCar(Engine engine) {        super(engine);    }    public String getBrand() {        return "Boss";    }}public class TinyCar extends RefinedCar {    public TinyCar(Engine engine) {        super(engine);    }    public String getBrand() {        return "Tiny";    }}

 

4.6 客户端使用桥接模式

客户端可以根据需要选择不同的品牌和引擎类型进行组合,从而创建不同的汽车:


 

 

javapublic class Main {    public static void main(String[] args) {        RefinedCar car = new BossCar(new HybridEngine());        car.drive();    }}

 

输出结果:


 
Starting Hybrid Engine...Driving Boss car...

 

5. 桥接模式的优势

通过桥接模式,我们可以将汽车的品牌和引擎类型分离,品牌和引擎的组合不再受到继承层次的限制。这样一来,品牌和引擎可以独立扩展,增加一个新的引擎或品牌时,不需要修改现有的代码,只需要创建新的实现类即可。这不仅减少了子类的数量,也让代码的可维护性大大提高。

6. 桥接模式的应用场景

桥接模式适用于以下场景:

  • 当系统中有多个维度的变化时,可以使用桥接模式将它们分开独立扩展。

  • 当系统中的类层次结构非常庞大且复杂,使用桥接模式可以有效地降低继承带来的类爆炸。

  • 当一个类的抽象和实现部分需要独立扩展时,可以使用桥接模式进行解耦。

7. 小结

桥接模式通过将抽象接口和它的实现部分分开,使得系统可以按两个维度进行独立扩展。桥接模式的应用让类层次结构更加清晰,扩展更加灵活,避免了传统继承方式带来的子类爆炸问题。

练习
使用桥接模式扩展一种新的品牌,并为其创建一个新的引擎类型——核动力引擎

以上就是桥接模式的详细介绍及其实现,希望大家在实际开发中能理解并灵活运用这一设计模式,提升代码的可扩展性和可维护性。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值