`
HQFish
  • 浏览: 9710 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

桥接模式(Bridge Pattern)

阅读更多
模式动机:
    开发一个程序,可以绘制矩形、正方形、圆形、椭圆形四种图形,且每个图形都有不同的颜色如:红、绿、蓝。
    最直接的作法是:为每一种图形都提供一种颜色的类, 示意图如下:会发现完成该类图需要4*3=12个类,如果再多几种图形或是多几种颜色,会发现有非常多的子类。
 
 
    现在面临的问题是子类太多,而且随着图形和颜色的增加,子类会越来越多,如果再添加一个维度:人,不同的人(如:成年男性、成年女性和小孩等)可以绘制多种不同颜色的图形,那子类将达到:3种人*4种图形*3种颜色=36个。
    分析以上问题发现有图形和颜色两个维度都在变化,最终的输出结果是两个维度的组合,所以可以采用以下的方式来设计:

 

    从类图中可以看到图形和颜色有各自的互不干扰的独立继承体系,这样的优点在于图形或是颜色遇到变化(拥抱变化设计)而扩展(对扩展开放,这里的通过继承来扩展)时可以不影响对方,且子类的数量大大减少。这种设计方式称之为桥接方式:对于有两个变化维度(也可以是多个)的系统,采用上述设计系统中的类的个数更少,系统也更宜扩展桥接模式将继续关系转换为关联关系,从而降底了类与类之间的耦合,降底类的个数。
 
模式定义:
    将抽象部分与它的实现部分分离,使它们都可以独立地变化。即:不只改变你的实现,也改变你的抽象。
 

 
结合图2来理解模式的定义,“将抽象部分与它的实现部分分离”:即是将基础图形与颜色分离,基础图形是抽象部分,上色是实现部分。“使它们都可以独立地变化” :基础图形与颜色都有各自的父类,都可以自由扩展。
 
演示代码:    
定义图形的父类及子类,作为示例,只写了矩形和正方形的子类;而且我们把图形作为桥接模式中的抽象部分,担象部分的行为是以实现部分实现的,所以图形类都有颜色类(实现部分)的引用
/**
 * 图形父类
 * @author yuhq
 *
 */
public abstract class Shap {
 /**
  * 绘制图形
  * @param color 上色器
  */
 public abstract void doDraw(Color color);
}


/**
 * 矩形子类
 * @author yuhq
 *
 */
public class Rectangle extends Shap{
 public void doDraw(Color color) {
  String cr = color.doColor();
  System.out.println("正在绘制"+cr+"颜色的矩形");
 }
}


/**
 * 正方形
 * @author yuhq
 *
 */
public class Square {
 public void doDraw(Color color) {
  String cr = color.doColor();
  System.out.println("正在绘制"+cr+"颜色的正方式形");
 }
}
/**
 * 颜色父类
 * @author yuhq
 *
 */
public abstract class Color {
 public abstract String doColor();
}




/**
 * 红色子类
 * @author yuhq
 *
 */
public class Red extends Color{
 public String doColor() {
  return "红色";
 }
}



/**
 * 绿色子类
 * @author yuhq
 *
 */
public class Green {
 public String doColor() {
  return "绿色";
 }
}
 
//这里的Main方法即是图3中的Client,通过该Client可以绘制各种带颜色的图形

public class DrawMain {
 public static void main(String[] args) {
  //绘制红色矩形
  Shap rectangle = new Rectangle();
  Color red = new Red();
  rectangle.doDraw(red);
 
  //绘制绿色色矩形
  Color green = new Red();
  rectangle.doDraw(green);
 
 }
}
 
输出结果: 
 
 
深入思考:
    桥接模式的关键是如何将变化的维度分离出来,并确定谁是抽象部分,谁是实现部分。
    上述绘图的例子较为简单,而且基础图形和颜色谁是抽象部分,谁是实现部分区别不大,再举一个贴近我们生活的例子:设计一个新的接口友好的电视遥控器程序,让所有遥控器斟于相同的抽象,而对此抽象又做出许多不同的实现--每部不同型号的电视都有自己的遥控器实现。
    分析:你不会第一次就做对遥控器的用户界面,事实上,我们希望随着可用性数据收集得越来越丰富的同时,持续改良遥控器。困难之处在于:遥控器(不断改良 )会改变,而电视机也会改变。你已经将用户界面抽象出来,所以可以根据不同电视机改变它的实现。事情还不只这样,随着时间 的增长,用户会对此界面提出一些想法,你还必须应对他们的反馈来改变抽象。
    先看一种简单直接的设计,如下图:
 
设计遥控器的抽象类,不同的型号的电视有不同的实现。这种设计简单粗爆,完全没有考虑到未来的变化:遥控器需要不断改良,为不同用户设计不同的遥控器。所以这里会发生变化的有两个维度:遥控器、不同电视对遥控器的实现。

现在有了两个层次结构,一个是遥控器,一个是平台特定的电视机实现,有了桥接的存在,可以独立的改变这两个层次。
 
桥接的优点:
    1、将实现予以解耦,让它和界面之再永久绑定。
    2、抽象和实现可以独立扩展,不会影响到对方。
    3、对于“具体的抽象”所做的改变,不会影响到客户。
桥接的用途和缺点:
    1、适合使用在需要跨越多个平台的图形和窗口系统上。
    2、当需要用不同的方式改变接口和实现时,你会发现桥接模式很好用。
    3、桥接模式的缺点是增加了复杂度。 

 
 

桥接模式(Bridge Pattern)的应用一 

 
 
 
  • 大小: 42.8 KB
  • 大小: 80 KB
  • 大小: 340.7 KB
  • 大小: 8.4 KB
  • 大小: 42.5 KB
  • 大小: 60.9 KB
分享到:
评论

相关推荐

    设计模式之桥接模式BridgePattern

    桥接模式(Bridge Pattern)是设计模式中的一种结构型模式,它主要解决的是在软件设计中,当抽象和实现之间存在紧密耦合时,如何使这两者能够独立地变化。这种模式通过引入一个抽象层来分离接口和实现,使得它们可以...

    c++-设计模式之桥接模式(Bridge Pattern)

    桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使得两者可以独立地变化。这种模式常用于需要在多个维度上变化的场景,比如不同的形状和颜色,允许在不改变客户端代码的情况下增加新...

    设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式

    创建型模式 (100%) 设计模式面面观(8):创建型模式总结 (100%) 设计模式面面观(9):适配器模式(Adapter Pattern)-结构型模式 (100%) 设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式 ...

    桥接模式(Bridge Pattern)原理图

    桥接模式是一种结构型设计模式,它的目的是将抽象化与实现化解耦,使得它们可以独立变化。这种模式主要用于处理当一个类存在两个或多个独立的变化的维度时的情况,例如,当一个类的抽象部分和实现部分可能发生变化,...

    Bridge 桥接模式(结构型模式)

    桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目的是将抽象部分与实现部分分离,使得它们可以独立地进行变化。在软件工程中,这种分离有助于降低复杂性,提高代码的可维护性和可扩展性。桥接模式的核心...

    桥接模式和策略模式的区别,内含可运行代码和两者详细区别

    首先,桥接模式(Bridge Pattern)的核心思想是“分离抽象与实现”。它通过建立一个抽象层和一个实现层的独立继承体系,使得抽象部分和实现部分可以独立变化,形成一种解耦的设计。在桥接模式中,抽象类引用实现类的...

    设计模型之桥接模式 bridge C++实现源码,vs2019

    桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目的是将抽象部分与其实现部分解耦,使得它们可以独立地进行变化和发展。在C++编程中,这种模式的应用可以帮助我们构建灵活、可扩展的系统,尤其在面对...

    设计模式---桥接模式

    在提供的压缩包文件"Com.Area.BridgePattern"中,我们可以期待找到以下内容: - `Abstraction` 类或接口,它定义了基本操作和对实现对象的引用。 - `RefinedAbstraction` 类,扩展了`Abstraction`,可能添加了更具体...

    C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式)

    桥接模式(Bridge Pattern)是面向对象设计中的一种结构型模式,它将抽象部分与实现部分分离,使得它们可以独立地进行变化。在C#编程中,桥接模式的应用能够帮助我们更好地解耦系统,提高代码的灵活性和可扩展性。 ...

    C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式) (Level 300)

    桥接模式(Bridge Pattern)是一种结构型设计模式,它旨在将抽象部分与其实现部分分离,使得它们可以独立地进行变化。在C#编程中,这种模式尤其有用,因为随着软件系统的复杂性增加,类的继承层次可能会变得难以管理...

    设计模式之桥接模式

    桥接模式(Bridge Pattern)是设计模式中结构型模式的一种,它的主要目的是将抽象部分与实现部分解耦,使得它们可以独立地进行变化。在Java编程中,这种模式的应用可以帮助我们构建更加灵活、可扩展的代码结构。 ...

    适配器、桥接模式实例代码

    适配器模式(Adapter Pattern)和桥接模式(Bridge Pattern)是两种非常重要的设计模式,它们各自在特定场景下发挥着重要作用。 适配器模式的核心思想是将两个不兼容的接口进行适配,使得原本无法一起工作的类能够...

    BridgePattern 桥接设计模式示例

    桥接设计模式是一种结构型设计模式,它将抽象部分与其实现部分相分离,使得它们可以独立进行变化。在实际的软件开发中,这种模式能够帮助我们构建灵活、可扩展的系统,允许我们在不修改原有代码的情况下增加新的功能...

    .NET设计模式(9):桥接模式(BridgePattern)

    [GOF《设计模式》]图1Bridge模式结构图桥接模式将抽象部分与它的实现分离,使它们能够独立地变化。一个普通的开关控制的电灯、电风扇等等,都是桥接的例子。开关的目的是将设备打开或关闭。实际的开关可以是简单的双...

    桥接模式demo

    桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目的是将抽象部分与实现部分分离,使得它们可以独立地进行变化。在这个“桥接模式demo”中,我们可能看到一个具体的示例,如何通过该模式将接口或抽象类的...

    java常用设计模式-桥接模式

    桥接模式(Bridge Pattern)是一种常用的设计模式,它将抽象化和实现化解耦,使用封装、聚合以及继承等基本技术,将两个独立变化的维度通过抽象化的方式进行桥接,从而降低了它们之间的耦合度,使得系统更加灵活。...

    设计模式之桥接模式.pdf

    桥接模式(Bridge Pattern)是一种常用的结构型设计模式,它主要用于解决抽象部分和实现部分的耦合问题。这种模式通过将抽象和实现分离,使得两者可以独立变化。这种设计方式不仅提高了系统的可扩展性,还简化了系统...

    Python设计模式之桥接模式原理与用法实例分析

    桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化. 下面是一个桥接模式的demo: #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'Andy' 大话设计模式 设计模式——...

Global site tag (gtag.js) - Google Analytics