桥接模式

桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是用组合关系代替继承关系来实现的,从而降低了抽象和实现两个可变维度的耦合性,桥接模式包含以下主要角色

  • 抽象化角色:定义抽象类,并包含一个对实现化对象的引用
  • 扩展抽象化角色:抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法
  • 实现化角色:定义实现化角色接口,供扩展抽象化角色调用
  • 具体实现化角色:给出实现化角色接口的具体实现

【案例】

现对不同手机类型的不同品牌实现看电影、玩游戏、打电话功能

传统方式解决手机问题的类图

使用桥接模式后的类图

public class BridgeTest {public static void main(String[] args) {Phone phone = new FoldedPhone(new HUAWEI());//折叠式的华为手机phone.playGame();phone.watchTV();phone.call();Phone phone1 = new DirectPhone(new XIAOMI());//直屏小米手机phone1.playGame();phone1.watchTV();phone1.call();}
}
interface Brand{ //实现化角色void watchTV();void playGame();void call();
}
class XIAOMI implements Brand{ //具体实现化角色public void watchTV() {System.out.println("小米手机看电视");}public void playGame() {System.out.println("小米手机打游戏");}public void call() {System.out.println("小米手机打电话");}
}
class HUAWEI implements Brand{ //具体实现化角色public void watchTV() {System.out.println("华为手机看电视");}public void playGame() {System.out.println("华为手机打游戏");}public void call() {System.out.println("华为手机打电话");}
}
abstract class Phone{ //抽象化角色private Brand brand;public Phone(Brand brand) {this.brand = brand;}//构造器protected void watchTV(){brand.watchTV();}protected void playGame(){brand.playGame();}protected void call(){brand.call();}
}
class FoldedPhone extends Phone{ //扩展抽象化角色public FoldedPhone(Brand brand) {super(brand);}public void watchTV() {super.watchTV();System.out.println("折叠屏样式手机");}public void playGame() {super.playGame();System.out.println("折叠屏样式手机");}public void call() {super.call();System.out.println("折叠屏样式手机");}
}
class DirectPhone extends Phone{ //扩展抽象化角色public DirectPhone(Brand brand) {super(brand);}public void watchTV() {super.watchTV();System.out.println("直屏样式手机");}public void playGame() {super.playGame();System.out.println("直屏样式手机");}public void call() {super.call();System.out.println("直屏样式手机");}
}

桥接模式的优缺点

  • 优点
    1、分离抽象接口及其实现部分,从而极大的增加了系统的灵活性
    2、桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统
    3、实现细节对客户透明,可以对用户隐藏实现细节
    4、减少了子类的个数,降低了管理和维护成本
  • 缺点
    1、桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
    2、桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

适用场景

1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

23种设计模式之桥接模式相关推荐

  1. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之桥接模式

    · 桥接模式在王者荣耀中的应用 · 一.简述 王者荣耀中有一个观战系统.在观战系统中,玩家可以观看大神如何在战场上操作,从而学习大神出装.团战技巧等,同时也可以看好友如何战斗,以及回放自己的经典之战. ...

  2. 深入理解23种设计模式(6) -- 桥接模式

    基本介绍 桥接模式(Bridge模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变 是一种结构型设计模式 Bridge模式给予类的最小设计原则,通过使用封装.聚合及继承等行为让不同 ...

  3. Java实现23种设计模式(五):桥接模式

    二十三种设计模式分类 一.概述 桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化.它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度.桥接模式主要想实 ...

  4. 23种设计模式——装饰者模式

    文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...

  5. 实践GoF的23种设计模式:建造者模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...

  6. 【Go实现】实践GoF的23种设计模式:命令模式

    上一篇:[Go实现]实践GoF的23种设计模式:代理模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Patter ...

  7. 23种设计模式7_代理模式之一静态代理

    23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...

  8. 23种设计模式之命令模式和策略模式的区别

    文章目录 概述 命令模式 策略模式 相同点 总结 概述 命令模式和策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的 ...

  9. 23种设计模式之代理模式

    文章目录 代理模式的定义与特点 代理模式的结构与实现 模式的结构 模式的实现 代理模式的应用场景 代理模式的应用实例 代理模式的扩展 代理模式分类 静态代理 动态代理 在有些情况下,一个客户不能或者不 ...

最新文章

  1. maven的配置-2019-4-13
  2. android位运算简单讲解
  3. .NET速度的问题,不是最重要的
  4. XCTF-MISC-新手区:stegano
  5. python 温度转换程序_Python程序将米转换为码
  6. web安全---XSS利用平台BLUE-LOTUS安装与使用
  7. 如何将C语言翻译成汇编语言,如何把汇编语言转换成C语言
  8. 前端笔记-thymeleaf获取及回显input标签type=radio
  9. 【算法题目】数组中的逆序对
  10. 【字符串】面试题之键值对(”key = valude”)字符串
  11. 金融评分卡项目—7.申请评分卡中的数据预处理和特征衍生
  12. echarts formatter_Angular 集成 Typescript 版本 Echarts (附代码)
  13. WPF: 自动设置Owner的ShowDialog
  14. python while 循环 全局变量_python循环语句(while amp; for)
  15. php dom 分离html内容
  16. Hdu2184汉诺塔VIII
  17. 【已开源】Flutter 穿山甲广告插件的集成-FlutterAds
  18. 如何重置Mac的蓝牙模块以解决连接问题
  19. 计算机一级考试PPT部分几分,计算机一级考试PPT幻灯片和最后一题(就是自己输网址)各有多少分啊...
  20. 2017acl---Learning Cognitive Features from Gaze Data for Sentiment and Sarcasm Classification笔记

热门文章

  1. LabVIEW编程LabVIEW开发为什么有人学的快
  2. 软件测试性能测试安全测试
  3. 怎么检测声音频率和幅值_声学成像——看得见的声音
  4. 如何快速生成icns格式的Mac图标
  5. WIFI密码破解 WIFI万能钥匙 显示连接密码去除广告优化版
  6. 电脑连接到手机并安装手机驱动usb-driver
  7. 大创:小车运动部分计划及端口(1)
  8. NDIS驱动程序安装总结
  9. OSPO 五阶段成熟度模型解析
  10. 吴永进lisp_AutoLISP$DCL基础篇