[OOD] 隔离变化-桥接模式

背景

正如电脑主机和显示器之间,主机的配置千变万化,不断升级,显示器可能升级缓慢。如果这时你买的是一体机,硬件升级就要受到限制。这就是一个典型的分离变化的需求场景。

在应用中,一个业务会有多个协作者,直接耦合会导致其中一个类的变化就会影响其它类的行为。这时最好的做法是对行为进行抽象,区分出变与不变,或者核心与外围的部分,然后定义出接口来隔离变化。

以Chromium的主文档加载为例。FrameLoader负责一个Frame的加载逻辑,从开始加载(load())或者重新加载(reload()),到结束(stopLoading()),这个过程是固定的,概括而言(即进行抽象)就是:

开始 -> 发送请求 -> 收到响应头信息 -> 收到页面数据 -> 完成。

但是中间过程中每个阶段可能做的事情不一样 (识别变化),包括:

1. 请求发送前,做些准备工作,或者改变一些参数。

2. 收到响应头,判断一下响应头里如果有特殊字段,需要采取不同的行为。

等等。

一边是Frame和FrameLoader的交互,另一边则是FrameLoader与业务层的交互。这就是需要进行隔离的界面。

设计方案

Frame和FrameLoader仍然关注于加载的逻辑,需要外部的协作时通过FrameLoaderClient这个接口与具体的实现交互。外部的FrameLoaderClientImpl执行如何的操作时也完全由它们控制,比如FrameLoaderClientImpl,有些事则进一步交由再上层的模块去完成。

这种方案被大量使用,比如WebViewClient和WebWidget:

这个示例更接近于它所属的桥接(Bridge)模式, 而上面FrameLoaderClient则像是一个退化的版本。

小结

这种模式就是桥接模式(Bridge Pattern)。

核心都是使用一个抽象的接口隔离变化,既提高了各层的内聚性,又降低它们间的耦合。符合OO原则中的:

1. 封装变化

2. 针对接口编程,而不针对具体的实现。

3. 降低交互对象的耦合度。

缺点是: 提高了复杂度。

时间: 2024-10-26 16:21:44

[OOD] 隔离变化-桥接模式的相关文章

设计模式之桥接模式优秀的程序结构(十五)

咱不要多, 就一个隐身技能, 嘿嘿嘿 定义 桥接模式(bridge): 在软件系统中, 某些由于自身的逻辑, 它具有两个或多个维度的变化, 那么如何应对这种"多维度的变化"? 如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化, 而又不引入额外的复杂度?这就是Bridge模式. 而具体使用的方式, 则是将抽象部分与他们的实现部分分离, 使得他们都可以独立的变化. 桥接模式解决的问题: 调用方操作的子类数目减少了 实现部分切换十分容易, 主要变现在抽象部分与实现部分的耦合度

php实现设计模式之 桥接模式

<?php /*桥接模式:将抽象部分与实现部分分离,使它们都可以独立的变化. * * 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,桥接模式就是应对这种多维度的变化 */ /*例子:不同的车在不同的街道上行驶.车可变,街道可变 * * */ abstract class road{ abstract public function run(); } class quickroad extends road{ public $car; public function __con

设计模式实战-桥接模式

桥接模式基础知识: 定义 将抽象部分和实现部分分离,使它们可以实现独立的变化 桥接模式的知识点 桥接是在被分离了的抽象部分和实现部分之间来搭桥,桥接在程序上体现成了在抽象部分拥有实现部分的接口对象,维护桥接就是维护这个关系 桥接模式的意图:使得抽象部分和实现部分可以独立的变化,都可以随便扩充 桥接模式可以实现运行时动态组合具体的真实实现,从而达到动态变换功能的目的 桥接模式适合两个维度的变化,而继承适用于一个维度的变化 使用桥接模式的时候,要注意谁来创建Implementor的对象,并把它设置到

9,桥接模式(Bridge Pattern)是将抽象部分与实际部分分离,使它们都可以独立的变化。

Bridge 模式又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任. 它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展.  适用于: 桥接模式(Bridge Pattern)是将抽象部分与实现部分分离(解耦合),使它们都可以独立的变化. 车 安装 发动机 :不同型号的车,安装不同型号的发动机        将"车

从桥接模式与策略模式谈起(转载)

原文地址:http://www.blogjava.net/wangle/archive/2007/04/25/113545.html 从桥接模式与策略模式谈起 桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式.以下是它们的UML结构图. 在桥接模式中,Abstraction通过聚合的方式引用Implementor. 在策略模式中,Context也使用聚合的方式引用Startegy抽象接口. 从他们的结构图可知,在这两种模式中,都存在一个对象使用聚合的方式引

javascript设计模式-桥接模式

在系统中,某些类由于自身逻辑,具有两个或两个以上维度的变化,如何使得该类型可以沿多个方向变化,但又不引入额外的复杂度,这就是桥接模式要解决的问题. 定义:桥接模式(Bridge),将抽象部分与它的实现部分分离,使他们可以独立的变化. 意图:将抽象与实现解耦. 对于前端,比较常用的场景,是事件监控: addEvent(element, 'click', getDrinkById); function getDrinkById(e) { var id = this.id; asyncRequest(

5分钟读书笔记之 - 设计模式 - 桥接模式

补充一点知识: 私有变量 在对象内部使用'var'关键字来声明,而且它只能被私有函数和特权方法访问.私有函数 在对象的构造函数里声明(或者是通过var functionName=function(){...}来定义),它能被特权函数调用(包括对象的构造函数)和私有函数调用.特权方法 通过this.methodName=function(){...}来声明而且可能被对象外部的代码调用.可以使用:this.特权函数() 方式来调用特权函数,使用 :私有函数()方式来调用私有函数.公共属性 通过thi

设计模式 -- 桥接模式(Bridge Pattern)

桥接模式 Bridge Pattern 结构设计模式 定义: 分离抽象部分和实现部分,使他们独立运行. 避免使用继承导致系统类个数暴增,可以考虑桥接模式. 桥接模式将继承关系转化为关联关系,减少耦合,减少代码量. 例如: public interface Shape { public void bepaint(String color); } public abstract class Color { Shape shape; public void setShape(Shape shape)

浅说解决VMware桥接模式连接主机

内容概要: 1: 搞懂VMware的桥接,NAT,HostOnly三种模式的意义. 2: 分别示范,CentOS 6,CentOS 7的手动分配固定虚拟机的IP地址. 3: 使用桥接方法ping通主机,并用Xshell远程控制. 解决的问题: 1: 虚拟机上不了网. 2: 无法ping通主机或远程连接. 3: 网卡启动总是失败,报错. 写作目的: 初装linux后,我们会习惯性的ping一下主机,看看虚拟机是否和主机连接正常,若正常便会迫不及待的用Xshell远程连接虚拟机,进行验证并操作.可安