设计模式之桥接模式

2023-11-15

一、手机操作问题

现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网,打电话等),如图:
在这里插入图片描述

1.传统方案解决手机操作问题

在这里插入图片描述

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

  1. 扩展性问题( 类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加。
  2. 违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本.
  3. 解决方案-使用 桥接模式

二、桥接模式

1.基本介绍

  1. 桥接模式是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变
  2. 是一种结构性设计模式
  3. Bride模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象与行为实现分离开来,从而可以保持各部分的独立性以及对应他们的功能扩展

2.原理类图

在这里插入图片描述

  1. Client:桥接模式的调用者
  2. 抽象类(Abstraction):维护了Implementor/即它的实现类ConcreteImplementorA,二者是聚合关系, Abstraction充当桥接类
  3. RefinedAbstraction : 是 Abstraction 抽象类的子类
  4. Implementor : 行为实现类的接口
  5. ConcreteImplementorA/B :行为的具体实现类
  6. 从 UML 图:这里的抽象类和接口是聚合的关系,其实调用和被调用关系

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

1.类图

在这里插入图片描述

2.代码

2.抽象类

/**
 * @author: LiDeLin  18234780819@163.com
 * @date: 2019/11/10
 * @description :
 */
public abstract class Phone {

    private  Brand brand;

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


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


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

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

抽象类子类

/**
 * @author: LiDeLin  18234780819@163.com
 * @date: 2019/11/10
 * @description :
 */
public class UpRightPhone extends Phone {

    public UpRightPhone(Brand brand) {
        super(brand);
    }

    @Override
    protected void call() {
        super.call();
        System.out.println("直立式手机");
    }

    @Override
    protected void close() {
        super.close();
        System.out.println("直立式手机");
    }

    @Override
    protected void open() {
        super.open();
        System.out.println("直立式手机");
    }
}
/**
 * @author: LiDeLin  18234780819@163.com
 * @date: 2019/11/10
 * @description :
 */
public class FlodedPhone extends Phone {


    public FlodedPhone(Brand brand) {
        super(brand);
    }

    @Override
    public void open(){
        super.open();
        System.out.println("折叠手机 ");
    }

    @Override
    protected void close() {
        super.close();
        System.out.println("折叠手机");
    }

    @Override
    protected void call() {
        super.call();
        System.out.println("折叠手机");
    }
}

行为类接口

/**
 * @author: LiDeLin  18234780819@163.com
 * @date: 2019/11/10
 * @description : 接口
 */
public interface Brand {


    void open();

    void close();

    void call();

}

接口实现类

/**
 * @author: LiDeLin  18234780819@163.com
 * @date: 2019/11/10
 * @description :
 */
public 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打电话");

    }
}

/**
 * @author: LiDeLin  18234780819@163.com
 * @date: 2019/11/10
 * @description :
 */
public class XiaoMi implements Brand {
    @Override
    public void open() {
        System.out.println("小米开机");
    }

    @Override
    public void close() {
        System.out.println("小米关机");

    }

    @Override
    public void call() {
        System.out.println("小米打电话");

    }
}

客户端调用

/**
 * @author: LiDeLin  18234780819@163.com
 * @date: 2019/11/10
 * @description :
 */
public class Client {

    public static void main(String[] args) {
        //获取折叠式手机(样式加品牌)


        Phone flodedPhone = new FlodedPhone(new XiaoMi());

        flodedPhone.open();
        flodedPhone.call();
        flodedPhone.close();

        System.out.println("----------------------------------------");

        Phone flodedPhone2 = new FlodedPhone(new Vivo());

        flodedPhone2.open();
        flodedPhone2.call();
        flodedPhone2.close();


        System.out.println("=============================");

        UpRightPhone upRightPhone = new UpRightPhone(new XiaoMi());

        upRightPhone.open();
        upRightPhone.call();
        upRightPhone.close();
        System.out.println("==============================");
        UpRightPhone upRightPhone2 = new UpRightPhone(new Vivo());

        upRightPhone2.open();
        upRightPhone2.call();
        upRightPhone2.close();

    }

}

四、桥接模式在 JDBC 的源码剖析

  1. Jdbc 的 Driver 接口,如果从桥接模式来看,Driver 就是一个接口,下面可以有 MySQL 的 Driver,Oracle 的Driver,这些就可以当做实现接口类
  2. 在这里插入图片描述
    在这里插入图片描述

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

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

六、常见的应用场景

  1. JDBC驱动程序
  2. 银行转账系统
  3. 转账分类:网上转账,柜台转账,AMT转账
  4. 转账用户类型:普通用户,银卡用户,金卡用户
  5. 消息管理,消息类型:即时消息,延时消息
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式之桥接模式 的相关文章

  • 常用设计模式总结

    设计模式的相关知识 很多书籍和博客中都有详细总结 本文总结的目的 1 将自己学习到的设计模式的知识按照自己的逻辑重新总结 方便查看和记忆 2 方便让自己对设计模式中常用的知识有一个系统的认知 设计模式 话设计模式 书中提到 24 种设计模式
  • 设计模式-单一职责原则介绍与理解

    描述 一个类应该专注于实现一个功能 好处 便于代码复用 举例 俄罗斯方块游戏 首先可以想到的是游戏逻辑与界面的分离 也就是说逻辑一个类 界面部分一个类 这样做的好处就是我们可以复用游戏逻辑的代码 例如我们用java写了一个基于PC端的俄罗斯
  • 离散仿真引擎基础作业与练习

    作业内容 一 简答题 1 解释 GameObjects 和 Assets 的区别与联系 2 下载几个游戏案例 分别总结资源 对象组织的结构 3 使用 debug 验证 MonoBehaviour 基本行为或事件触发条件 4 了解 GameO
  • 设计模式之(三)---工厂方法模式

    女娲补天的故事大家都听过吧 这个故事是说 女娲在补了天后 下到凡间一看 哇塞 风景太优美了 天空是湛 蓝的 水是清澈的 空气是清新的 太美丽了 然后就待时间长了就有点寂寞了 没有动物 这些看的到 都是静态的东西呀 怎么办 别忘了是神仙呀 没
  • C++设计模式(二)观察者模式

    1 观察者模式知识点 1 定义 定义对象间的一种一对多的依赖关系 当一个对象的状态发生改变的时候 所有依赖它的对象都得到通知并自动更新 2 动机 将一个系统分割成一系列相互协作的类有一个常见的副作用 需要维护相关对象间的一致性 我们不希望为
  • 设计模式的 C++ 实现---工厂方法模式(二)

    前文回顾 单例模式 一 单例模式 二 观察者模式 简单工厂模式 工厂方法模式 一 前言 对于工厂方法模式 当增加新产品时 也需要对应增加一个工厂类 可以使用模版进行封装 减少代码工作量 实现举例 产品抽象基类 class Animal pu
  • Java设计模式:装饰者模式(Decorator Pattern)

    装饰者模式 涉及的重要设计原则 类应该对扩展开放 对修改关闭 装饰者模式定义 装饰者模式动态地将责任附加到对象上 若要扩展功能 装饰者提供了比继承更有弹性的替代方案 UML类图 装饰者模式事例 咖啡店 咖啡种类 1 深焙咖啡 DarkRoa
  • 面向过程和面向对象的语言有哪些,以及优缺点(一篇文章让你理解)

    C语言是面向过程的 而C python java是面向对象的 面向过程的编程思想将一个功能分解为一 个一个小的步骤 我们通过完成一个一 个的小的步骤来完成一个程序 优点 这种编程方式 符合我们人类的思维 编写起来相对比较简单 缺点 但是这种
  • Java设计模式-装饰者模式Decorator

    介绍 装饰者模式的核心思想是通过创建一个装饰对象 即装饰者 动态扩展目标对象的功能 并且不会改变目标对象的结构 提供了一种比继承更灵活的替代方案 需要注意的是 装饰对象要与目标对象实现相同的接口 或继承相同的抽象类 另外装饰对象需要持有目标
  • 六大设计原则--开闭原则

    定义 software entities like classes modules and functions should be open for extension but closed for modifications 一个软件实体
  • [C++]备忘录模式

    备忘录模式 Memento Pattern 保存一个对象的某个状态 以便在适当的时候恢复对象 备忘录模式属于行为型模式 github源码路径 https github com dangwei 90 Design Mode 此文件包含 mai
  • 程杰“大话设计模式”中的设计原则

    单一职责原则 SRP 就一个类而言 应该仅有一个引起它变化的原因 如果一个类承担的职责过多 就等于把这些职责耦合在了一起 一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力 这种耦合会导致脆弱的设计 当发生变化时 设计会遭受到意想不到
  • Java并发编程之设计模式

    同步模式之保护性暂停 1 定义 即 Guarded Suspension 用在一个线程等待另一个线程的执行结果 要点 有一个结果需要从一个线程传递到另一个线程 让他们关联同一个 GuardedObject 如果有结果不断从一个线程到另一个线
  • 设计模式之享元模式

    享元模式 就是共享技术 对于系统中存在大量相同的对象 把他们抽取成一个对象放在缓存中进行使用 这样可以大大节省系统资源 例如 围棋棋盘上有两种棋子 一个是黑子 一个是白子 如果在下棋的时候每下一个棋子就要new一个棋子对象 那么就会有大量的
  • [设计模式]模板方法模式(Template Method)

    1 意图 定义一个操作中的算法的骨架 而将一些步骤延迟到子类中 TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 2 动机 其实就是如意图所描述的 算法的骨架是一样的 就是有些特殊步骤不一样 就可以
  • 【设计模式】工厂模式(Factory Pattern)

    1 概述 工厂模式 Factory Pattern 是最常用的设计模式之一 它属于创建类型的设计模式 它提供了一种创建对象的最佳方式 在工厂模式中 我们在创建对象时不会对客户端暴露创建逻辑 并且是通过一个共同的接口来指向新创建的对象 工厂模
  • 设计模式详解---策略模式

    1 策略模式简介 策略模式 Strategy Pattern 是一种行为型设计模式 用于在运行时根据不同的情境选择不同的算法或策略 该模式将算法封装成独立的类 使得它们可以相互替换 而且可以独立于客户端使用它们的方式 1 1 主要角色 上下
  • 设计模式(三)-结构型模式(4)-组合模式

    一 为何需要组合模式 Composite 在代码设计中 有种情况是对象之间存在层次关系 即对象之间会存在父结点和子结点的关系 比如在文件管理系统中 所有文件和文件夹形成树状结构 文件夹目录里存在子文件夹和文件 文件夹属于枝结点 文件属于叶结
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • 【设计模式之美】 SOLID 原则之五:依赖反转原则:将代码执行流程交给框架

    文章目录 一 控制反转 IOC 二 依赖注入 DI 三 依赖注入框架 DI Framework 四 依赖反转原则 DIP 一 控制反转 IOC 通过一个例子来看一下 什么是控制反转 public class UserServiceTest

随机推荐

  • vue之路由的嵌套(父子路由)

    路由的嵌套 1 配置路由 main js文件中 import Users from components Users import UserAdd from components Users UserAdd import UserList
  • 第二章 Scala入门——让你的代码跑起来

    一 Scala的安装方法 要使用Scala 首先需要保证已经安装好了Java 8 对于Linux操作系统 Java 8已经默认安装了 而使用Windows操作系统的用户 则需要在Java官网下载安装包进行安装 请在CMD PowerShel
  • 小米解bl锁跳过168小时_红米K30S至尊纪念版秒解BL工具分享支持小米红米机型秒解BL跳过168小时...

    目前小米的新机 官方风控都默认绑定7天也就是168小时才能解锁BL 部分账号需要绑定15天才能满足条件 导致很多爱玩机的小伙伴被拒门外 并不是所有人都愿意等待官方解锁时候 而跳过168小时解锁 也成为了很多小伙伴希望的事情 本工具来自ROM
  • 操作系统CPU调度

    概述 多道程序操作系统的基础 通过在进程之间切换CPU 操作系统可以提高计算机的吞吐率 对于单处理器系统 每次只允许一个进程运行 任何其他进程必须等待 直到CPU空闲能被调度为止 CPU按一定的调度算法从就绪队列中选择一个进程 把CPU的使
  • TorchVision中使用FasterRCNN+ResNet50+FPN进行目标检测

    TorchVision中给出了使用ResNet 50 FPN主干 backbone 构建Faster R CNN的pretrained模型 模型存放位置为https download pytorch org models fasterrcn
  • PE文件资源解析(七)manifest资源的解析

    mainfest资源 在这里指的是资源类型为RT MANIFEST的资源信息 通过ResHacker看到的效果图如下 manifest资源存储编码格式是UTF 8 开始3个字节是EF BB BF 解析代码如下 UTF8 EF BB BF H
  • Java练习10:输入两个正整数m和n,求其最大公约数和最小公倍数

    辗转相除法 package com qiqi test import java util Scanner 输入两个正整数m和n 求其最大公约数和最小公倍数 辗转相除法 1 用大数m 小数n得第一个余数 2 余数为0则n为最大公约数 3 余数
  • 【数据库原理选择题1-4章】

    1 1 数据库系统概述 1 1 DB DBMS 和DBS 三者之间的关系是 A DBMS包括DB和DBS B DB 包括DBMS和DBS C 不能相互包括 D DBS包括DB和DBMS 正确答案 D 2 位于用户和操作系统之间的一层数据管理
  • VS2017 登录账户时,反复让输入密码,而一直无法登陆。

    问题描述 VS2017 登录账户时 反复让输入密码 而一直无法登陆成功 最后显示无法刷新此账户凭据 解决办法 在排除是自己账户或者网络有问题后 通过清理用户数据解决问题 具体步骤如下 使用管理员权限打开命令终端 转到VS安装目录下的 Com
  • torch中的model.eval()、model.train()详解

    个人简介 深度学习图像领域工作者 工作总结链接 https blog csdn net qq 28949847 article details 128552785 链接中主要是个人工作的总结 每个链接都是一些常用demo 代码直接复制运行即
  • 欧几里得距离(欧式距离)

    文章目录 一 定义 二 公式 一 定义 欧几里得度量 欧氏距离 Euclidean Metric Euclidean Distance 指在m维空间中两个点之间的真实距离 或者向量的自然长度 即该点到原点的距离 比如 在二维和三维空间中的欧
  • 液滴/液膜蒸发过程—in文件模拟-后处理分析-Ovito/Python绘图

    关注 M r m a t e r i a l color Violet rm Mr material Mr material
  • FDR计算

    FDR计算 FDR的计算很简单 我折腾了一上午主要是因为遇到了以下几个问题 问题 FDR是什么 有什么用 怎么计算 我把几个模型的P值都合并成一个表了 所以每次运算FDR时 我需挑选特定的对象 我有多个模型 所以我想着要如何构建循环 FDR
  • 机器学习-人为设置函数方法和神经网络方法解决智能五子棋问题

    2 智能决策 2 1 博弈树模型算法 2 1 1 全局估算函数 此次项目中评估函数有两种 1 人为设定函数方法 更具人的经验 对一些特定的棋形在棋盘上进行检索 并且计数 最后赋予相应权值求和得到对棋盘的评价值 典型的棋形有 活一 活二 活三
  • 集成学习-理论概述

    1 集成学习概述 集成学习 ensemble learning 本身不是一个单独的机器学习算法 而是通过构建并结合多个机器学习器来完成学习任务 集成学习的特点 集成方法是一种将几种机器学习技术组合成一个预测模型的元算法 以减小方差 bagg
  • IDEA中如何导入module并成功运行

    在写Java项目的时候我们通常需要导入module 需要注意的是导入过程需要以下两大步骤 否则会出现无法运行的情况 以下我以导入 service edu 模块为例 一 将module文件拷贝到工程目录下 直接将需要导入的module文件 s
  • 李宏毅深度学习——优化方法

    记录了关于梯度的历史 SGD SGD with Momentum 防止gradient为0 SGD停止不动了 sgd with momentum 前面的移动会累加到下一步 sgd with momentum 前面的移动会累加到下一步 所以小
  • 【07节】Python3+Selenium4自动化 unittest 测试框架详解

    文章目录 1 unittest 框架介绍 2 创建单元测试步骤 3 unittest 模块介绍 3 1 TestCase 类 3 1 1 TestCase 类常用方法 3 1 2 TestCase 类其他方法 3 2 setUp 与 tea
  • 【cpu or gpu】【tensorflow】怎么查看用的是CPU还是GPU

    方法1 from tensorflow python client import device lib print device lib list local devices 参考博客 可用设备为 name device CPU 0 dev
  • 设计模式之桥接模式

    文章目录 一 手机操作问题 1 传统方案解决手机操作问题 2 传统方案解决手机操作问题分析 二 桥接模式 1 基本介绍 2 原理类图 三 桥接模式解决手机操作的问题 1 类图 2 代码 2 抽象类 抽象类子类 行为类接口 接口实现类 客户端