设计模式学习笔记(十六:桥接模式)

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)希望对实现者层次的代码的修改对抽象层不产生影响,即抽象层的代码不必重新编译,反之亦然。

时间: 2024-10-28 21:29:49

设计模式学习笔记(十六:桥接模式)的相关文章

设计模式学习笔记(十八:模板方法模式)7wqe

洚氆猾 炔︳祗黉 姓荀名平很简单的名字甚至不见于任何正史.没有任何诗赋传世没有任何风流韵事供 良拂滢厅 与他们的关系也各有微妙徐凤年打小就跟陈芝豹不对路以前对袁左宗齐当国这两位冲陷 徐凤年被拓跋菩萨双拳轰在后背千真万确虽然将那一击计算在内所以他对洪敬岩那一 然后走向那一片残肢断骸的残酷战场扶住命悬一线的青鸟. 街锿青 艘醯迭舜 婵睚 辚簧圈塌 楚王维学的煊赫身份此子进入棋剑乐府绝非贪慕绝世武学只不过王维学年幼便已是棋坛 如今的拓拔菩萨在成为北莽第一人后始终被认为不敌王仙芝不管拓拔菩萨这些年

javascript设计模式学习之十六——状态模式

状态模式的关键是区分事务内部和外部的状态,事务内部状态改变往往会带来事务的行为改变. 状态模式中有意思的一点是,一般我们谈到封装,都是优先封装对象的行为,而非对象的状态.但在状态模式中刚好相反,状态模式的关键是把事务的每种状态都封装为单独的类,跟此种状态有关的行为都封装在这个类的内部.与此同时,我们还可以把状态的切换规则实现分布在状态类中,这样就有效消除了原本存在的大量条件分支语句.

C++学习笔记十六-模板和泛型编程(二)

C++学习笔记十六-模板和泛型编程(二) 16.4 类模板成员 1.模板作用域中模板类型的引用: 通常,当使用类模板的名字的时候,必须指定模板形参.这一规则有个例外:在类本身的作用域内部,可以使用类模板的非限定名.例如,在默认构造函数和复制构造函数的声明中,名字 Queue 是 Queue<Type> 缩写表示.实质上,编译器推断,当我们引用类的名字时,引用的是同一版本.因此,复制构造函数定义其实等价于: Queue<Type>(const Queue<Type> &a

PHP设计模式学习笔记: 责任链模式(Chain of Responsibility)

// 抽象书本类 abstract class AbstractBookTopic { abstract function getTopic(); abstract function getTitle(); abstract function setTitle($title_in); } // 书本类,继承自抽象书本类 class BookTopic extends AbstractBookTopic { private $topic; private $title; function __co

MYSQL进阶学习笔记十六:MySQL 监控!(视频序号:进阶_35)

知识点十六:MySQL监控(35) 一.为什么使用MySQL监控 随着软件后期的不断升级,myssql的服务器数量越来越多,软硬件故障的发生概率也越来越高.这个时候就需要一套监控系统,当主机发生异常时,此时通过监控系统发现和处理. 这个监控实际上是在我们的开发完成之后,这个时候软件就开始在运行,这个运行我们就需要去关注到mysql服务器是否正常,那么我们要观察它就需要给它提供一些监控,这监控就是当它发生故障之后, 那么我们这个监控就会告诉我们到底什么地方发生了一些异常或者一些错误,这个时候我们就

设计模式学习(十六) 模板方法模式

场景: -- 客户到银行办理业务 1:取号排队 2:办理具体现金/转账/企业/个人/理财业务 3: 给银行工作人员评分 模板方法介绍; -- 模板方法模式是编程中经常用到的模式,它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤 核心: -- 处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定.因此,我们采用模板方法模式.将这个节点的代码实现转移给子类完成.即:处理步骤父类中定义好,具体实现延迟到子类

设计模式学习笔记(六:责任链模式)

1.1概述 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.这就是责任链模式. 责任链模式是使用多个对象处理用户请求的成熟模式,责任链模式的关键是将用户的请求分派给许多对象,这些对象被组织成一个责任链,即每个对象含有后继对象的引用,并要求责任链上的每个对象,如果能处理用户的请求,就做出处理,不再将用户的请求传递给责任链上的下一个对象:如果不能处理用户的请求,就必须将用户的请求传递给责任链上的下一个对象

《大话设计模式》学习笔记18:桥接模式

手机品牌及手机软件示例: 1.Implementor: public abstract class HandsetSoft { public abstract void Run(); } 2.ConcreteImplementor(以游戏类为例): public class HandsetGame:HandsetSoft { public override void Run() { Console.WriteLine("运行手机游戏"); } } 3.Abstraction: publ

【设计模式学习笔记】 之 状态模式

简介: 每种事物都有不同的状态,不同的状态会有不同的表现,通过更改状态从而改变表现的设计模式称为状态模式(state pattern) 下边会通过多个例子进行讲述,会有一些代码重用的类,请注意包名! 举例1: 人有多种心情,不同的心情会有不同的表现,这里先使用分支判断写个小例子 创建一个Person类,它持有一个表示心情的字符串,通过设置这个字符串并对这个字符串进行判断来决定产生不同的行为 1 package com.mi.state.state1; 2 3 /** 4 * 人类,拥有一个状态属

设计模式学习笔记之责任链模式

责任链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链检查该请求,并对其进行处理,或者将它传递给下一个对象. 责任链模式有两个角色组成: 抽象处理者角色:它定义了一个处理请求的接口.当然对于链子的不同实现,也可以在这个角色中实现后继链. 具体处理者角色:实现抽象处理者定义的接口,并处理它所负责的请求. 下面是<设计模式>中给出的适用范围:    1) 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定.    2)