设计模式--桥接模式(bridge)

一 案列

假如有一个汽车类,然后有三个品牌分别是宝马、奥迪、奔驰,而每一个品牌又有三种车分别是跑车、轿车、suv;同时他们的关系都是通过继承来实现的,此时可以看到当需要新增一个类的品牌的时候需要新增多个子类,必须新增捷豹,此时也需要新增跑车、轿车、suv,而新增一个皮卡车的时候可能也需要在奔驰、宝马、奥迪中新增子类。此时你会发现这样处理,类多的有点爆炸了。这时候就可以通过桥接模式来解决这个问题
在这里插入图片描述

二 桥接模式结构图

把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展

在这里插入图片描述

  • Client类:桥接模式的调用者
  • 抽象类(Abstraction) :维护了 Implementor / 即它的实现类ConcreteImplementorA…, 二者是聚合关系,Abstraction 充当桥接类
  • RefinedAbstraction:是 Abstraction抽象类的子类
  • Implementor:行为实现类的接口
  • ConcretelmplementorA/B: 行为的具体实现类

在这里插入图片描述
在car里面聚合brand让brand和car桥接关联起来,brand起到桥接作用

三 桥接模式实现

申明汽车品牌

public interface Brand {
    /**
     * 品牌信息
     */
    void info();

}

申明不同品牌的实现

public class BaoMa implements Brand {
    @Override
    public void info() {
        System.out.print("宝马汽车");
    }
}

public class BenCi implements Brand{
    @Override
    public void info() {
        System.out.print("奔驰汽车");
    }
}

申明汽车抽象

public abstract class Car {
    private Brand brand;

    public Car(Brand brand){
        this.brand = brand;
    }

    /**
     * 启动
     */
    abstract void start();

    /**
     * 关闭
     */
    abstract void close();

    public void info(){
        brand.info();
    }

}

申明不同汽车类型的抽象实现

public class SportsCar extends  Car{
    public SportsCar(Brand brand) {
        super(brand);
    }

    @Override
    void start() {
        super.info();
        System.out.println("启动");
    }

    @Override
    void close() {
        super.info();
        System.out.println("关闭");
    }
}

public class SuvCar  extends Car{
    public SuvCar(Brand brand) {
        super(brand);
    }

    @Override
    void start() {
        super.info();
        System.out.println("启动");
    }

    @Override
    void close() {
        super.info();
        System.out.println("关闭");
    }
}

客户端调用

public class Client {
    public static void main(String[] args) {
        Brand baoMa = new BaoMa();

        SportsCar baoMaSportCar = new SportsCar(baoMa);
        baoMaSportCar.start();
        baoMaSportCar.close();

        Brand benCi = new BenCi();
        SportsCar benCiSportsCar = new SportsCar(benCi);
        benCiSportsCar.start();
        benCiSportsCar.close();

    }
}

运行结果:

宝马汽车启动
宝马汽车关闭
奔驰汽车启动
奔驰汽车关闭

四 总结

优点:

  • 1.实现了抽象和实现部分的分离 桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来。
  • 2.更好的可扩展性 由于桥接模式把抽象部分和实现部分分离了,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了。
  • 3.更好的可扩展性

缺点:

  • 1.桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。

  • 2.桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值