前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式——桥接模式

设计模式——桥接模式

作者头像
Java架构师必看
发布2021-05-14 10:13:36
5190
发布2021-05-14 10:13:36
举报
文章被收录于专栏:Java架构师必看

设计模式——桥接模式

强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码

在生活中,一些对象具有两个或多个维度的变化,如用户购买汽车时,既要考虑品牌(奔驰、哈佛)又要考虑类型(轿车、SUV)等等。如果使用继承的方式实现,m 种品牌和 n 种类型就有 m*n 种,不但对应的子类多,而且扩展困难。如果使用桥接模式就能很好地解决这些问题。

一、传统方式实现


【1】传统方式:继承实现类图:

【2】传统解决方案问题分析:  ● 扩展性问题(类爆炸),如果继续增加品牌,就需要增加各个类型品牌的类,同样如果我们增加一个汽车类型,也要在增加汽车品牌类。  ● 违反了单一职责原则,当我们增加汽车类型时,要同时增加所有品牌的汽车,这样增加了代码的维护成本。

二、基本介绍


【1】桥接模式(Bridge模式):将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。 【2】是一种结构型设计模式。 【3】Bridge 模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstract)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。 【4】优点:由于抽象与实现分离,所以扩展能力强,其实现细节对客户透明。 【5】缺点:由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程。增加了系统的理解和设计难度。

三、桥接模式——原理类图


桥接(Bridge)模式包含一下主要角色: 【1】实现化(Implementor)角色【品牌接口类】:定义实现化角色的接口,供扩展抽象化角色调用【将所有品牌的方法进行抽取】 【2】具体实现化(Concrete Implementor)角色【品牌接口实现类】:给出实现化角色接口的具体实现 【3】抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用 【4】具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现

四、桥接模式代码案例分析


【1】接口类

代码语言:javascript
复制
public interface IBrand {
    //定义一个抽象方法 drive
    public void drive();
}

【2】接口的实现类(奔驰品牌,其他品牌略)

代码语言:javascript
复制
public class BenChiCar implements IBrand{
    @Override
    public void drive() {    
        System.out.println("奔驰品牌");
    }
}

【3】桥接类(抽象类):将接口组合进来,并调用业务方法。使用桥接后,增加品牌或类型时只需要增加一个实现类。

代码语言:javascript
复制
public abstract class AbstarctCar {
    //组合接口类
    private IBrand iBrand;
    //构造器
    public AbstarctCar(IBrand iBrand) {
        this.iBrand=iBrand;
    }

    //定义方法
    public void drive() {
        //调用品牌类的实现
        this.iBrand.drive();
    }
}

【4】抽象类的具体实现类(汽车类型的实现类)

代码语言:javascript
复制
public class SUVCar extends AbstarctCar{
    //重写构造器
    public SUVCar(IBrand iBrand) {
        super(iBrand);
    }
    //重写diver 方法,调用品牌类的业务方法 。如下 super.drive 并添加SUV的业务
    @Override
    public void drive() {
        // 品牌的实现
        super.drive();
        //SUV 的业务处理
        System.out.println("SUV 型号汽车");
    }
}

【5】Client 客户端调用类

代码语言:javascript
复制
public class Client {
    public static void main(String[] args) {
        //调用需要的类型的实例类和品牌实例类 的业务方法
        new SUVCar(new BenChiCar()).drive();
        /*输出如下:
         * 奔驰品牌
         * SUV 型号汽车
         */
    }
}

五、桥接模式的注意事项和细节


1)、实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。 2)、对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以,其他部分由具体业务来完成。 3)、桥接模式代替多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。 4)、桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和开发。 5)、桥接模式要正确识别出系统中两个独立的维度,因此其使用范围有一定的局限性,即需要有这样的应用场景。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、传统方式实现
  • 二、基本介绍
    • 三、桥接模式——原理类图
    • 四、桥接模式代码案例分析
    • 五、桥接模式的注意事项和细节
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档