`

BRIGE(桥接) ------ 对象结构型模式

 
阅读更多
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、代码示例
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();
       }
   }
}




    
  • 大小: 66.9 KB
分享到:
评论

相关推荐

    结构型模式之桥接模式(bridge)

    桥接模式是设计模式中的一种结构型模式,其主要目的是为了分离抽象部分和实现部分,以便两者能够独立地进行变化。这种模式的核心理念是通过引入一个抽象层来封装多种可能的实现,使得抽象和实现之间形成一种“桥接”...

    flink-table-api-java-bridge_2.11-1.10.0-API文档-中文版.zip

    赠送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;...

    clickhouse-jdbc-bridgeRPM安装包适应于centos678

    6. **启动服务**:使用`systemctl start clickhouse-jdbc-bridge`启动桥接服务,如果需要开机自启,执行`systemctl enable clickhouse-jdbc-bridge`。 四、JDBC连接 1. **JDBC驱动**:在Java应用中,需添加`...

    brige资源文档

    1. Bridge的核心概念:Bridge设计模式是一种软件设计模式,旨在解决不同组件或模块之间的交互问题。它充当了系统内部不同部分之间的接口,使得原本不兼容的组件可以协同工作。在实际应用中,Bridge可能用于操作系统...

    clickhouse-jdbc-bridge:从ClickHouse到外部数据库的JDBC代理

    ClickHouse JDBC桥 用于ClickHouse:registered:的JDBC桥。 它充当无状态代理,将查询从ClickHouse传递到外部数据源。 使用此扩展,您可以跨多个数据源实时在ClickHouse上运行分布式查询,从而以某种方式简化了用于...

    steelapi:hltv-discord-brige使用的webapi

    通过以上分析,我们可以看到,"steelapi:hltv-discord-brige使用的webapi"是一个结合了HLTV和Discord功能的实用工具,利用JavaScript和Web API技术,为CS:GO爱好者提供了一个实时交流的桥梁。在实际开发中,开发者...

    MATLAB Simulink仿真Full-Bridge-LLC-close-loop-270V-28V

    资源提供的仿真模型结构清晰,参数可调,用户能够通过MATLAB Simulink平台直观地进行仿真操作。模型中详细的电路设计和控制算法,使得用户能够深入了解电路动态响应和稳态特性。通过仿真,用户可以获取系统在不同...

    protel99se封装库PROTEL PCB封装库器件库常用芯片接插件电子元器件封装1263个合集.zip

    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/...

    vue-bridge-webview:javascript bridge androidios webview

    Vue桥Web视图 javascript bridge android / ios webview 安装 浏览器 [removed][removed] [removed][removed] 包装经理 npm install vue-bridge-webview --save import Vue from ' vue ' import VueBridgeWebview ...

    cv-bridgeConfig(用于20.04的ubuntu使用目标识别)

    cv-bridgeConfig(用于20.04的ubuntu使用目标识别)

    mqtt-rest-bridge

    MQTT REST桥MQTT REST Bridge是一个在MQTT和REST协议之间桥接的软件包。 我们称API使多个Python项目与其连接。如何安装poetry add git+https://github.com/NubeIO/mqtt-rest-bridge@master如何删除poetry remove ...

    设计模式源代码

    Brige Builder ChainOfResponsibility Command Composite Decorator Facade Factory FlyWeight Interpreter Iterator Mediator Memento Observer Prototype Proxy Singleton State Strategy TemplateMethod Visitor

    ACIS与HOOPS图形平台的交互

    - **数据结构兼容性**:由于ACIS和HOOPS采用不同的数据结构描述同一模型,因此需要设计一套机制来实现两者之间的数据转换和同步。 以Dcam凸轮设计系统为例,该系统充分利用了ACIS的几何造型能力和HOOPS的图形交互...

    虚拟机连网方法

    虚拟机连网

    6.6kw obc pcb 两相交错图腾柱 halfg brige

    6.6kw obc pcb 两相交错图腾柱

    mod-http-event-bus-bridge:Vert.X事件总线的HTTP桥

    Vert.x HTTP事件总线桥什么是Vert.x HTTP事件总线桥Vert.x事件总线桥允许非基于Vert.x的客户端通过HTTP REST接口使用Vert.x事件总线。 当前支持以下功能: 发送消息并将其发布到事件总线异步地将响应发送回发出请求...

    Qt安装超详细安装步骤.pdf

    知识点详细说明: 1. Qt概述: Qt是一个跨平台的C++应用程序框架,用于开发GUI程序,同时也可以用于开发非GUI程序,比如命令行工具和服务器。Qt支持多种操作系统平台,包括Windows、Linux、Mac OS X、Android和...

    基于OSGi和Spring开发Web应用的Demo

    根据压缩包子文件的文件名称,我们可以推测这些文件可能代表了这样的模块结构: 1. `com.zxn.example.service.compute.add`:这部分可能包含了一个名为“add”的计算服务实现,用于执行加法操作。在OSGi环境中,这...

    建筑物之间桥的链接 C语言的实现

    根据给定的文件标题、描述、标签以及部分内容,...综上所述,本文档中的程序通过 C 语言实现了基于深度优先搜索的建筑物间连通性判断功能,不仅解决了题目中提出的问题,还涉及到了数据结构与算法设计的核心知识点。

Global site tag (gtag.js) - Google Analytics