- 浏览: 59869 次
- 性别:
- 来自: 北京
文章分类
最新评论
1、意图
将抽象部分与它的实现部分分离,使它们都可以独立地变化,通常被认为是双重抽象。
2、别名
Handle/Body
3、动机
当一个抽象类可能有多个实现时,通常用继承来协调它们。抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。但是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分进行独立地进行修改、扩充和重用。
让我们考虑在一个用户界面工具箱中,一个可移植的Window抽象部分的实现。例如,这一抽象部分应该允许用户开发一些在X Window System和IBM的presentation Manager(PM)系统中都可以用到的应用程序。运用继承机制,我们可以定义Window抽象类和它的两个子类XWindow与PMWindow,由它们分别实现不同系统平台上的Window界面。但是继承机制有两个不足之处:
1)扩展Window抽象使之适用于不同种类的窗口或新的系统平台很不方便。假设有Window的一个子类Icon Window,它专门将Window抽象用于图标处理。为了使Icon Window支持两个系统平台,我们必须实现两个新类XIconWindow和PMIconWindow,更为糟糕的是,我们不得不为每一种类型的窗口都定义两个类。而为了支持第三个系统平台我们还必须为每一种窗口定义一个新的Window子类
2)继承机制使得客户代码与平台相关。每当客户创建一个窗口时,必须要实例化一个具体的类,这个类有特定的实现部分。例如,创建Xwindow对象会将Window抽象与Xwindow的实现部分绑定起来,这使得客户程序依赖于X Window的实现部分。这将使得很难讲客户代码移植到其他平台上去。
客户在创建窗口时应该不涉及到其具体实现部分。仅仅是窗口的实现部分依赖于运行的平台。这样客户代码在创建窗口时就不应涉及到特定的平台。
Bridge模式解决以上问题的方法是,将Window抽象和它的实现部分分别放在独立的类层次结构中。其中一个类层次结构针对窗口接口(Window、IconWindow、TransientWindow),另外一个独立的类层次结构针对平台相关的窗口实现部分,这个类层次结构的根类为WindowImpl。例如XwindowImpl之类提供了一个X Window系统的实现。
对Window之类的所有操作都是用WindowImpl接口中的抽象操作实现的。这就将窗口的抽象与系统平台相关的实现部分分离开来。因此,我么将Window与WindowImpl之间的关系城之为桥接,因为它在抽象类与它的实现之间起到了桥梁作用,使它们可以独立地变化。
4、适用性
以下一些情况下使用Bridge模式:
你不希望在抽象和它的实现之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
类的抽象以及它的实现都应该可以通过生成子类的方式加以扩充。这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
对一个抽象部分的修改应对客户不产生影响,即客户的代码不比重新编译。
你想对客户完全隐藏抽象的实现部分。
正如意图一节的第一个类图中所示的那样,有许多类要生成。这样一种类层次结构说明你必须将一个对象分成两个部分。
你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
5、结构
6、代码示例
将抽象部分与它的实现部分分离,使它们都可以独立地变化,通常被认为是双重抽象。
2、别名
Handle/Body
3、动机
当一个抽象类可能有多个实现时,通常用继承来协调它们。抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。但是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分进行独立地进行修改、扩充和重用。
让我们考虑在一个用户界面工具箱中,一个可移植的Window抽象部分的实现。例如,这一抽象部分应该允许用户开发一些在X Window System和IBM的presentation Manager(PM)系统中都可以用到的应用程序。运用继承机制,我们可以定义Window抽象类和它的两个子类XWindow与PMWindow,由它们分别实现不同系统平台上的Window界面。但是继承机制有两个不足之处:
1)扩展Window抽象使之适用于不同种类的窗口或新的系统平台很不方便。假设有Window的一个子类Icon Window,它专门将Window抽象用于图标处理。为了使Icon Window支持两个系统平台,我们必须实现两个新类XIconWindow和PMIconWindow,更为糟糕的是,我们不得不为每一种类型的窗口都定义两个类。而为了支持第三个系统平台我们还必须为每一种窗口定义一个新的Window子类
2)继承机制使得客户代码与平台相关。每当客户创建一个窗口时,必须要实例化一个具体的类,这个类有特定的实现部分。例如,创建Xwindow对象会将Window抽象与Xwindow的实现部分绑定起来,这使得客户程序依赖于X Window的实现部分。这将使得很难讲客户代码移植到其他平台上去。
客户在创建窗口时应该不涉及到其具体实现部分。仅仅是窗口的实现部分依赖于运行的平台。这样客户代码在创建窗口时就不应涉及到特定的平台。
Bridge模式解决以上问题的方法是,将Window抽象和它的实现部分分别放在独立的类层次结构中。其中一个类层次结构针对窗口接口(Window、IconWindow、TransientWindow),另外一个独立的类层次结构针对平台相关的窗口实现部分,这个类层次结构的根类为WindowImpl。例如XwindowImpl之类提供了一个X Window系统的实现。
对Window之类的所有操作都是用WindowImpl接口中的抽象操作实现的。这就将窗口的抽象与系统平台相关的实现部分分离开来。因此,我么将Window与WindowImpl之间的关系城之为桥接,因为它在抽象类与它的实现之间起到了桥梁作用,使它们可以独立地变化。
4、适用性
以下一些情况下使用Bridge模式:
你不希望在抽象和它的实现之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
类的抽象以及它的实现都应该可以通过生成子类的方式加以扩充。这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
对一个抽象部分的修改应对客户不产生影响,即客户的代码不比重新编译。
你想对客户完全隐藏抽象的实现部分。
正如意图一节的第一个类图中所示的那样,有许多类要生成。这样一种类层次结构说明你必须将一个对象分成两个部分。
你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
5、结构
6、代码示例
The following Java (SE 6) program illustrates the 'shape' example given below and will output: API1.circle at 1.000000:2.000000 radius 7.5000000 API2.circle at 5.000000:7.000000 radius 27.500000 /** "Implementor" */ interface DrawingAPI { public void drawCircle(double x, double y, double radius); } /** "ConcreteImplementor" 1/2 */ class DrawingAPI1 implements DrawingAPI { public void drawCircle(double x, double y, double radius) { System.out.printf("API1.circle at %f:%f radius %f\n", x, y, radius); } } /** "ConcreteImplementor" 2/2 */ class DrawingAPI2 implements DrawingAPI { public void drawCircle(double x, double y, double radius) { System.out.printf("API2.circle at %f:%f radius %f\n", x, y, radius); } } /** "Abstraction" */ abstract class Shape { protected DrawingAPI drawingAPI; protected Shape(DrawingAPI drawingAPI){ this.drawingAPI = drawingAPI; } public abstract void draw(); // low-level public abstract void resizeByPercentage(double pct); // high-level } /** "Refined Abstraction" */ class CircleShape extends Shape { private double x, y, radius; public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) { super(drawingAPI); this.x = x; this.y = y; this.radius = radius; } // low-level i.e. Implementation specific public void draw() { drawingAPI.drawCircle(x, y, radius); } // high-level i.e. Abstraction specific public void resizeByPercentage(double pct) { radius *= pct; } } /** "Client" */ class BridgePattern { public static void main(String[] args) { Shape[] shapes = new Shape[] { new CircleShape(1, 2, 3, new DrawingAPI1()), new CircleShape(5, 7, 11, new DrawingAPI2()), }; for (Shape shape : shapes) { shape.resizeByPercentage(2.5); shape.draw(); } } }
发表评论
-
STRATEGY(策略)——对象行为型模式
2013-06-17 16:19 6441、意图 定义一系列的算法,把它们一个个封装起来,并且 ... -
STATE(状态)—— 对象行为型模式
2013-06-14 16:49 7391、意图 允许一个 ... -
OBSERVER(观察者)——对象行为型模式
2013-06-13 15:36 6421、意图 定义对象 ... -
MEDIATOR(中介者)——对象行为型模式
2013-06-09 16:17 6491、意图 用一个中 ... -
CHAIN OF RESPONSIBILITY(职责链) —— 对象行为型模式
2013-06-06 16:32 6151、意图 使多个对象都有机会处理请求,从而避免请求的发 ... -
PROXY(代理) —— 对象结构型模式
2013-06-05 11:24 7251、意图 为其他对 ... -
DECORATOR(装饰) -—— 对象机构型模式
2013-06-03 11:43 6671、意图 动态地给一个对象添加一些额外的职责。就增加功 ... -
COMPOSITE(组合) ---- 对象结构型模式
2013-05-31 15:12 7201、意图 将对象组 ... -
FACTORY METHOD(工厂方法) ---- 对象创建型模式
2013-05-28 11:43 6951、意图 定义一个用于创建对象的接口,让子类决定实例化 ... -
设计模式的三大分类解析
2013-05-24 14:48 805设计模式在功能上 ... -
TEMPLATE METHOD(模板方法)----- 类行为型模式
2013-04-07 11:27 6701、意图 定义一个 ... -
ADAPTER(适配器) --- 类对象结构型模式
2013-03-28 11:33 5571、意图 将一个类的接口转化成客户希望的另外一个接口。 ... -
COMMAND(命令) ---- 对象行为型模式
2013-03-06 11:20 6911、意图 将一个请求封装为一个对象,从而使你可用不同的 ... -
VISITOR(访问者) ---- 对象行为型模式
2013-02-26 17:03 8541、意图 表示 ... -
Builder(生成器)---- 对象创建型模式
2013-02-25 15:54 5951、意图 将一个复杂对象的创建和它的表示分离,使得同样的 ... -
ABSTRACT FACTORY(抽象工厂)------ 对象创建型模式
2013-02-22 11:21 6501、意图 提供一个创建一系列相关或相互依赖对象的接口,而 ... -
Flyweight pattern(享元模式)
2013-02-20 14:45 7331. 概述 面向对象技术可以很好地解决系统一些灵活性或可扩展 ... -
Facade模式 --- 对象结构型模式
2013-02-19 17:03 6721、意图 为子系统中 ... -
23个设计模式的名字和意图
2013-02-19 15:41 6831、Abstract Factory:提供 ... -
从MVC理解设计模式
2013-02-19 14:40 727本文将透过MVC来帮助我们理解“模式”这一术语的含义。 ...
相关推荐
赠送jar包:flink-table-api-java-bridge_2.11-1.10.0.jar; 赠送原API文档:flink-table-api-java-bridge_2.11-1.10.0-javadoc.jar; 赠送源代码:flink-table-api-java-bridge_2.11-1.10.0-sources.jar;...
brigde,setting,document,test
Vue桥Web视图 javascript bridge android / ios webview 安装 浏览器 [removed][removed] [removed][removed] 包装经理 npm install vue-bridge-webview --save import Vue from ' vue ' import VueBridgeWebview ...
BRIGE1 BT-ANT BT-F3816 BTFTBM501 BUZZ1 C8051F300 CA45B CA45C CA45D CAN-8 CAN-10 CAN-12 CAN8 CC-4-P CC-5-P CC-7-P CC-8-P CC4.572 CC5.08 CC6.096 CC7.62 CDFP-G10/Y2.2 CDFP-G14/C9 CDFP-G16/X.65 CDFP-G20/...
超视距HLTV-discord-bridge的API
MQTT REST桥MQTT REST Bridge是一个在MQTT和REST协议之间桥接的软件包。 我们称API使多个Python项目与其连接。如何安装poetry add git+https://github.com/NubeIO/mqtt-rest-bridge@master如何删除poetry remove ...
本镜像内已含完整的Photoshop CS2、Adobe Photo Brige、Adobe全新的简体中文帮助中心! 安装完后完全支持在线升级!我感觉安装和启动速度竟然明显比之前的英文版快得多! 注意:激活码:1066-0292-8446-7778-8425 ...
Brige Builder ChainOfResponsibility Command Composite Decorator Facade Factory FlyWeight Interpreter Iterator Mediator Memento Observer Prototype Proxy Singleton State Strategy TemplateMethod Visitor
虚拟机连网
MT2Brige
Vert.x HTTP事件总线桥什么是Vert.x HTTP事件总线桥Vert.x事件总线桥允许非基于Vert.x的客户端通过HTTP REST接口使用Vert.x事件总线。 当前支持以下功能: 发送消息并将其发布到事件总线异步地将响应发送回发出请求...
介绍了ACIS与HOOPS图形平台各自的数据结构与特点,剖析了两者之间的交互,以开发的Dcam凸轮设计系统为例,进一步阐明了两者的沟通与协调过程,为基于ACIS与HOOPS双重平台的图形系统开发提供了方法.
小波阈值降噪模型在红外光谱信号处理中的应用研究.信号处理方面的论文
分析了2.6.15内核源码,主要解析网桥的实现原理,处理数据的流程
交换机探头(SwitchTap)是解决复杂交换网络的一种分析手段。交换机制造商发明了\"镜像端口\"的功能,交换机的镜像端口功能将指定交换机端口的流量转发到\"镜像端口\"从而完成流量或协议的分析。交换路由追踪...
该资源是高版本的cv——bridge,用于解决ros自带低版本opencv与项目需要高版本opencv冲突的问题。
神州数码公司通过“e-brige”网站为代理商提供IT产品,从事的是第一类电子商务活动;联众网站为个人消费者提供娱乐服务,从事的是第四类电子商务活动;工商银行等金融机构的在线银行通过网络为企业和个人提供金融...
适合新手安装Qt软件环境
单相桥式全控整流电路电阻负载(Single_phase_bridge_R.mdl)
ADB笔记1 android技术文档.doc Android Debug Brige原理介绍