1.1概述
将抽象部分与它的实现部分分离,使他们都可以独立地变化。这就是桥接模式的定义。
抽象类或接口中可以定义若干个抽象方法,习惯上将抽象方法称作操作。抽象类或接口使程序的设计者忽略操作的细节,即不必考虑这些操作是如何实现的,当用户程序面向抽象类或接口时,就不会依赖具体的实现,使系统具有很好的扩展性。但是,抽象类中的抽象方法总归是需要子类去实现的,在大多数情况下抽象类的子类完全可以胜任这样的工作,但是在某些情况下,子类可能会遇到一些难以处理的问题。
例如,电视台系统中有一个抽象类CCTV,该类有一个抽象方法abstract void makeProgram()。现在为了满足某些用户看电视剧的需求,这里给出了CCTV类的子类:CCTV8,该类的实例调用makeProgram()方法制作电视剧节目,因此子类CCTV8必须实现父类的makeProgram()方法,比如使用该方法制作出若干帧影像。子类CCTV8的makeProgram()方法在制作出第一帧影像后,比如在第一帧影像显示“CCTV8”,马上就发现以下两个问题:
(1)从第2帧开始应当是电视剧中的影像,而这样的影像不应当由CCTV8类的makeProgram()方法负责制作。
(2)如果CCTV8在makeProgram()方法中强行给出了第2帧以后的各个影像,那么用户使用CCTV8类的实例看到的电视剧是一个固定的电视剧,如果有其他用户想看新的电视剧,系统就必须新增新的CCTV子类,这对电视台系统是一个非常不合理的一种设计,因为CCTV类应当只有一个负责制作“电视剧”节目的子类:CCTV8,而不是多个,也就是说,不能因为一个新的用户要看不同的电视剧,就要出现一个专门为该用户制作“电视剧”节目的子类。
针对上述问题,应当将实现和抽象放在两个不同的类层次中,从而使他们可独立的改变,即将一个抽象类中抽象方法的重要实现部分交给另外一个抽象类的子类或实现另外一个接口的类。比如,对于上述问题,应当将makeProgram()方法的实现交给另外一个抽象类:Program,该类定义了制作影像的makeTVfilm()方法。
我们应当重新设计抽象类CCTV类,使该类包含Program的引用,这就可以使CCTV类的子类CCTV8在实现makeProgram()方法时,将该方法的重要实现部分交给Program类的makeTVfilm()方法,即委托给Program子类的实例调用makeTVfilm()方法。
我们称CCTV类和Program类之间的关系是桥接关系,也即是说,CCTV类的子类CCTV8仅仅在CCTV类和Program类之间起到一个“桥接”的作用,具体类关系如下图一所示:
图一:电视节目与电视剧制作的桥接关系
1.2模式的结构
桥接模式包括以下四种角色:
(1)抽象(Abstration):是一个抽象类,该抽象类含有Implementor声明的变量,即维护一个Implementor类型对象。
(2)实现者(Implementor):实现者角色是一个接口(抽象类),该接口(抽象类)中的方法不一定与Abstration类中方法一致。Implementor接口(抽象类)负责定义基本操作,而Abstration类负责定义基于这些基本操作的较高层次的操作。
(3)细化抽象(Refined Abstration):细化抽象是抽象角色的一个子类,该子类在重写(覆盖)抽象角色中的抽象方法时,在给出一些必要的操作后,将委托所维护Implementor类型对象调用相应的方法。
(4)具体实现者(Concrete Implementor):具体实现者是实现(扩展)Implementor接口(抽象类)的类。
桥接模式结构的类图如下图二所示:
图二:桥接模式的类图
1.3桥接模式的优点
(1)桥接模式分离实现与抽象,使抽象和实现可以独立的扩展。当修改实现的代码时,不影响抽象的代码,反之也一样。
(2)满足开-闭原则。抽象和实现者处在同层次,使系统可独立地扩展者两个层次。增加新的具体实现者,不需要修改细化对象,反之增加新的细化对象也不需要修改具体实现。
1.4适合使用桥接模式的情景
(1)不想让抽象和某些重要的实现代码是固定绑定关系,这部分实现可运行时动态决定。
(2)抽象和实现者都可以继承的方法独立地扩充而互不影响,程序在运行期间可能需要动态的将一个抽象的子类的实例与一个实现者的子类的实例进行组合。
(3)希望对实现者层次的代码的修改对抽象层不产生影响,即抽象层的代码不必重新编译,反之亦然。
相关推荐
桥接模式学习笔记 桥接模式是一种结构型设计模式,它将抽象部分与实现部分相分离,使它们都可以独立的发生变化。通过桥接模式,可以将强关联转为弱关联,将继承转换为组合关系,从而提高系统的灵活性和可扩展性。 ...
C++20设计模式学习笔记-第7章桥接模式学习代码
这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...
以上就是压缩包中的设计模式学习笔记涉及到的主要内容。通过对这些模式的理解和应用,开发者可以更好地解决软件设计中的问题,提升软件的质量和可维护性。每种模式都有其适用场景,理解其背后的意图和应用场景是关键...
《HeadFirst设计模式学习笔记》是一份详尽的资料,旨在帮助读者深入理解并掌握设计模式这一编程领域的核心概念。设计模式是软件工程中的一种最佳实践,它在解决常见问题时提供了一种标准的解决方案,使得代码更易于...
这个“23种设计模式学习笔记”文档将引导你深入理解这些模式,并帮助你在实际编程中有效地应用它们。以下是对23种设计模式的详细解读: 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。它常用于控制...
以下是对“C#设计模式学习笔记”中涉及的一些关键知识点的详细解释。 1. **设计模式的基本概念**: 设计模式是一种在特定上下文中已被证明有效的解决方案模板,它描述了如何在软件设计中解决常见问题。设计模式...
这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...
设计模式的学习不仅帮助我们编写更可维护、可扩展的代码,还能提高团队间的沟通效率,因为它们提供了通用的语言和解决方案。在实际开发中,灵活运用这些设计模式可以有效解决设计问题,提升代码质量。因此,深入理解...
"GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...
2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,...
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可读性、可维护性和可复用性。这些模式是面向对象编程中的一种最佳实践,通过标准化的方式处理常见的设计问题。下面...
在这个“#资源大人分享计划# 设计模式学习笔记.rar”压缩包中,我们可以期待找到一系列关于设计模式的详细学习资料,包括定义、类图、代码示例以及各种使用场景,这些都将帮助我们深入理解并掌握设计模式。...
以下是一些在尚学堂300Java设计模式部分学习笔记中涉及的设计模式的知识点: 创建型模式: 创建型模式主要解决对象创建的问题,确保系统的灵活性和封装创建细节。学习笔记中提到了5种创建型模式: 1. 单例模式...
### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...
这份"根据《JAVA与设计模式》整理的笔记及示例代码"涵盖了Java语言和设计模式的核心概念,旨在帮助开发者理解和应用这些模式。 一、设计模式的基本概念 设计模式是对在特定情境下软件设计问题的解决方案的一种描述...
### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...
根据给定的信息“图解设计模式,结城浩著学习笔记”,我们可以推断出这份文档主要涉及了设计模式的学习和理解。《图解设计模式》是一本由日本著名程序员结城浩撰写的书籍,该书以图形化的方式深入浅出地讲解了软件...
学习设计模式对于软件开发人员来说至关重要,主要基于以下几点理由: - **经验借鉴**:设计模式是基于众多专家的经验和智慧,提供了经过实践检验的解决方案。 - **提高可维护性和可复用性**:通过遵循已知的最佳...