我所知道设计模式之桥接模式

瘢痂泛型
• 阅读 1442

前言介绍


接下里介绍的是Java 的设计模式之一:桥接模式

我们还是以一个问题进行展开,引入桥接模式

现在对不同手机类型的不同品牌实现操作编程

比如:开机、关机、上网,打电话等

按照传统的模式,我们先要分不同类型的手机,每个类型下又有其他

我所知道设计模式之桥接模式

传统方法对应的类图,我们一起来看看,是怎么样

我所知道设计模式之桥接模式

传统方案解决手机操作问题分析


扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类

同样如果我们增加一个手机品牌,也要在各个手机样式类下增加。

违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本.

解决方案-使用桥接模式

我所知道设计模式之桥接模式

一、什么是桥接模式

桥接模式(Bridge 模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变

桥接模式 是一种结构型设计模式

Bridge 模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责

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

桥接模式的原理类图分析

我所知道设计模式之桥接模式

Client 类:桥接模式的调用者

抽象类(Abstraction) :维护了 Implementor / 即它的实现类 ConcreteImplementorA.

二者是聚合关系,Abstraction充当桥接类

RefinedAbstraction : 是 Abstraction 抽象类的子类

Implementor : 行为实现类的接口

ConcreteImplementorA /B :行为的具体实现类

从 UML 图:这里的抽象类和接口是聚合的关系,其实调用和被调用关系

二、桥接模式解决手机操作问题

使用桥接模式改进传统方式,让程序具有搞好的扩展性,利用程序维护

使用桥接模式对应的类图

我所知道设计模式之桥接模式

按照我们的思路,先创建品牌的接口

//接口
interface Brand {
    
    void open();//开机

    void close();//关机

    void call();//打电话
}

假如我们这个时候有小米品牌,只需要继承实现即可

class Vivo implements Brand {

    @Override
    public void open() {
        System.out.println(" Vivo 手机开机 ");
    }
    @Override
    public void close() {
        System.out.println(" Vivo 手机关机 ");
    }
    @Override
    public void call() {
        System.out.println(" Vivo 手机打电话 ");
    }
}

接下里我们创建抽象类手机,组合品牌

abstract class Phone {

    //组合品牌
    private Brand brand;

    //构造器
    public Phone(Brand brand) {
        super();
        this.brand = brand;
    }

    protected void open() {
        brand.open();
    }

    protected void close() {
        brand.close();
    }

    protected void call() {
        brand.call();
    }
}

同时这时我们创建手机样式类,并实现手机抽象类

class UpRightPhone extends Phone {

    //构造器
    public UpRightPhone(Brand brand) {
        super(brand);
    }
    @Override
    public void open() {
        super.open();
        System.out.println(" 直立样式手机 ");
    }
    @Override
    public void close() {
        super.close();
        System.out.println(" 直立样式手机 ");
    }
    @Override
    public void call() {
        super.call();
        System.out.println(" 直立样式手机 ");
    }
}

有没有发现,自立手机的open,是调用父类的open,而父类又调用接口

我们使用demo来体会一下桥接模式下的不同品牌与样式手机

public static void main(String[] args) {

    //获取折叠式手机 (样式 + 品牌 )
    Phone phone1 = new UpRightPhone(new Vivo());
    phone1.open();
    phone1.call();
    phone1.close();
}

运行结果如下:
Vivo 手机开机 
直立样式手机 
Vivo 手机打电话 
直立样式手机 
Vivo 手机关机 
直立样式手机 

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


实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。

对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成。

桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。

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

桥接模式要求正确识别出系统中两个独立变化的维度**(**抽象、和实现**)**,因此其使用范围有一定的局限性,即需要有这样的应用场景。

桥接模式其它应用场景

对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用

四、常见的应用场景

银行转账系统

转账分类: 网上转账,柜台转账,AMT 转账
转账用户类型:普通用户,银卡用户,金卡用户..

消息管理

消息类型:即时消息,延时消息
消息分类:手机短信,邮件消息,QQ 消息...

JDBC 驱动程序


尚硅谷:设计模式(韩顺平老师):桥接模式

Refactoring.Guru:《深入设计模式》

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
VirtualBox网络接入模式
VirtualBox的提供了四种网络接入模式,它们分别是:1、NAT  网络地址转换模式(NAT,NetworkAddressTranslation)2、BridgedAdapter  桥接模式3、Internal  内部网络模式4、HostonlyAdapter 主机模式下面我们分别对这四种网络模
Wesley13 Wesley13
3年前
VirtualBox网络NAT模式的端口映射设置
VirtualBox的提供了四种网络接入模式,它们分别是:1、NAT网络地址转换模式(NAT,NetworkAddressTranslation)2、BridgedAdapter桥接模式3、Internal内部网络模式4、HostonlyAdapter主机模式其中NAT模式是最简单的实现虚拟机上网的方式,可以认为
Wesley13 Wesley13
3年前
VirtualBox、VMware在桥接模式下无法获取ip地址问题
声明:参考https://blog.csdn.net/lcdcxy/article/details/49362171https://jingyan.baidu.com/article/948f59242e601dd80ff5f929.html     最近遇到这个问题,我们的主机和虚拟机相互之间能ssh登录并能上网的时候,在Virtu
Stella981 Stella981
3年前
CentOS7.3+MySQL5.7+Apache2.4+PHP7.1+phpMyAdmin4.7+JDK1.8+SVN1.6+Jenkins2.1环境搭建
CentOS7.3MySQL5.7Apache2.4PHP7.1phpMyAdmin4.7JDK1.8SVN1.6Jenkins2.1环境搭建1、安装CentOS7.3虚拟机安装说明:在创建虚拟机时,选择桥接模式1)进入安装界面后,选择Installorupgradeanexistingsystem选项2)选择En
Wesley13 Wesley13
3年前
Java中23种设计模式详解
Java中23种设计模式1\.设计模式31.1创建型模式41.1.1工厂方法41.1.2抽象工厂61.1.3建造者模式101.1.4单态模式131.1.5原型模式151.2结构型模式171.2.1适配器模式171.2.2桥接模式191.2.3组合
Wesley13 Wesley13
3年前
Java Design Patterns
java的设计模式大体上分为三大类:创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模
Wesley13 Wesley13
3年前
00_设计模式之语言选择
设计模式之语言选择设计模式简介背景设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式(Designpattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的