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

设计模式-Bridge

阅读更多
烈日,当空;没有一丝风,真的让人感觉透不过气来。想起去年夏天在没有空调的房子里写代码,^_^,真是对人性的一种考验。AndyTao正想着,不觉笑了。午休时间也快过了,继续写我的代码吧。

“Andy,过来帮我看看嘛!”一串银铃声传了过来。

“唉,美女相邀,怎能不动啊。”AndyTao心里想着,没敢说出口。“我说,你又怎么了?就你事多。”

“上次技术讨论会上听你说过,如果一个抽象类或者接口有多个具体的实现类(concrete subclass)的时候,为了不至于由于使用单纯继承进行抽象类或接口的具体实现而导致代码混乱和可重用性不强,你说应当采用Bridge设计模式,这是怎么一回事啊?你看我现在这个例子采用继承不是很好吗?”

“哦,我看看。”

public interface Draw {
public void paint();
}

public class DrawCircle implements Draw {
    public void paint(){
  System.out.println("paint Circle");
  ……
  }
  ……
}

public class DrawAngle implements Draw {
    public void paint(){
  System.out.println("paint Angle");
  ……
  }
  ……
}

“你看看,我这里不是各干其事,做得挺好嘛。”

“呵呵,听我细细讲来。通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以下两种情况:第一种是,这多个具体实现之间恰好是并列关系,就像你的这段代码,有两个concrete class:画圆和画三角;这两个形状上的图形是并列的,没有相对概念上的重复,那么我们只要使用继承就可以了。……”

“别卖关子了好不好!”“……”“好啦好啦,我请你喝可乐可以吧?”

嘿嘿,奸计得逞,AndyTao继续说道,“但是,我们要考虑到第二种情况,如果我们两个或多个具体实现之间有概念重复,那么需要我们把抽象共同部分和行为共同部分各自独立开来,原来是准备放在一个接口里,现在需要设计两个接口,分别放置抽象部分和行为部分。”

“好抽象啊,我听不懂!”

“那好,我们来举个例子,嗯……,就拿可乐来说吧,我们喝的可乐有大杯和小杯之分,而又有加冰和不加冰之分,这样,如果我们采用单纯继承来实现这四个具体实现(大杯加冰,大杯不加冰,小杯加冰,小杯不加冰),那么很容易造成相互之间的概念重叠,而且代码混乱,不容易维护。所以……”

“所以,怎么?继续继续。”

“所以啊,我们就要采用Bridge模式来重新设计类的结构。如果采用Bridge模式,我们就需要定义两个接口或抽象类,为的是把抽象部分和行为部分分隔开来。”

“稍等稍等,喝口水先。”“来来来,用我的吧。”“那……,真不好意思了,嘿嘿……”

“我们就用可乐作例子吧。将可乐定义为抽象类,有一部分共同的实现代码可以放到里面,加冰和不加冰属于行为,那么我们就把它定义成为行为接口。”

“然后,我们可以实现下面的抽象类。”

public abstract class Coke {
   CokeImp cokeImp;

   public void setCokeImp(CokeImp cokeImp) {
     this.cokeImp = cokeImp;
   }

   public CokeImp getCokeImp() {
  return this.cokeImp;
}

   public abstract void distributeCoke();
}

public abstract class CokeImp {
   public abstract void distributeCokeImp();
}

“现在,我们就有了两个抽象类(或接口)。上面,Coke是抽象部分,CokeImp是定义的行为抽象类。为了实现我们所说的四种类动态结合的功能,我们需要在具体实现类上下点功夫罗。”

“这是大可乐:”

public class BigCoke extends Coke
{
  public BigCoke() {}

  public void distributeCoke()
  {
    System.out.print("BigCoke ");
    CokeImp cokeImp = this.getCokeImp();
    cokeImp.distributeCokeImp();
  }
}

“这是小可乐:”

public class SmallCoke extends Coke
{
  public SmallCoke() {}

  public void distributeCoke()
  {
    System.out.print("SmallCoke ");
    CokeImp cokeImp = this.getCokeImp();
    cokeImp.distributeCokeImp();
  }
}

“我要加冰:”

public class IceCokeImp extends CokeImp
{
  IceCokeImp() {}

  public void distributeCokeImp()
  {
    System.out.print("Ice added");
  }
}


“不要冰了:”

public class NonIceCokeImp extends CokeImp
{
  NonIceCokeImp() {}

  public void distributeCokeImp()
  {
    System.out.print("Havn't ice");
  }
}

“这里需要注意了,由于我们的CokeImp和Coke是一对一的关系,所以要从我们的用例中找到这个*Imp是一个比较关键和困难的事情。”

“好啦,现在,你想喝哪种可乐?”

“我要小杯可乐加冰!”“这个简单,给你……”

Coke coke = new SmallCoke();
coke.setCokeImp(new IceCokeImp());
coke.distributeCoke();

“我要大杯可乐不加冰!”“Oh,Here!”

Coke coke = new BigCoke();
coke.setCokeImp(new NonIceCokeImp());
coke.distributeCoke();

“差不多Bridge模式就讲完了,另外,Bridge被广泛的应用于GUI和其它图形图象应用程序种,包括Java AWT。另外,Abstract Factory(抽象工厂模式)经常用来创建和设定一个Bridge,Bridge模式类似于Adapter(适配器模式)中的对象适配器模式。上面的两个模式上次不是都对你讲过了嘛。”

“哦,你一说我到想起来了,”Helen咬着手指,非常可爱的模样。“哇,迷死人了!”AndyTao只有偷偷想的份。^_^

“不过,你还要注意了,你在设计Bridge类的时候,要注意对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。另外,Bridge将会有许多类要生成,这样一种类层次结构说明你必须将一个对象分解成两个部分,抽象部分和实现部分。总之一句话,将抽象部分与它的实现部分分离,使它们都可以独立地变化。这就是Bridge模式的精髓所在了,还有……”

“还有什么,跟个唐僧似的。”“还有啊,别忘了你的可乐!哈哈哈!!”

“你呀,什么都记不住,就这在行。”

“哇,你这么了解我啊。”“去死吧你……”“哈哈哈!!!”
分享到:
评论

相关推荐

    设计模式---桥接模式

    桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立进行变化。这种模式在软件工程中被广泛应用于处理组件之间的耦合问题,特别是当需要为同一抽象提供多种实现或者需要独立地改变它们时。 ...

    java设计模式---诙谐易懂版

    根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...

    C#设计模式-吕震宇

    设计模式(16)-Bridge Pattern 设计模式(15)-Facade Pattern 设计模式(14)-Flyweight Pattern C#设计模式(13)-Proxy Pattern C#设计模式(12)-Decorator Pattern C#设计模式(11)-Composite Pattern ...

    liferay-faces-bridge-impl-3.0.0-ga1.zip

    在Java这样的静态类型语言中,通常不直接支持鸭子类型,但可以通过某些设计模式或库来模拟这种行为,提高代码的灵活性和可扩展性。 【标签】"开源项目" 指出这两个压缩包文件都是开源的,这意味着它们的源代码可以...

    pg194-axi-bridge-pcie-gen3.pdf

    AXI Bridge for PCI Express Gen3 Subsystem是一款专为FPGA设计的IP核,它提供了连接PCI Express(PCIe)Gen3接口与系统内部高级可扩展接口(AXI)总线的桥梁。该产品指南(PG194 v3.0)详细介绍了这款IP核的功能、...

    Laravel开发-twig-bridge

    你可以通过开启 `debug` 模式来获取更多的调试信息。\n\n8. **性能优化**\n\n为了提高性能,`Twig` 允许编译模板为 PHP 类,这样在后续请求中可以直接执行已编译的代码,而无需每次都解析模板。\n\n9. **整合其他...

    axi-ahb-apb-bridge.rar

    `axi-ahb-apb-bridge.rar`这个压缩包文件包含了关于这三种总线协议间转换接口的Verilog语言实现,这对于理解和设计SoC中的总线互连至关重要。 1. **AXI总线**:AXI是由ARM公司提出的高性能、高带宽的总线接口标准,...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题。这些模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师,通常被称为GoF(Gang of Four),在他们的经典著作...

    JAVA设计模式-chm版

    Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...

    【Java 设计模式-源码】Bridge 模式:在 Java 中解耦抽象与实现

    本文将介绍 Bridge 模式,它是一种结构型设计模式,用于解耦抽象与实现,增强软件系统的灵活性和可扩展性。 二、Bridge 设计模式的别名 Handle/Body 三、Bridge 设计模式的意图 Bridge 设计模式是 Java 中的一种结构...

    swift-Bridge高扩展iOSHTTP网络库

    这种模式借鉴了拦截器(Interceptor)的设计模式,广泛应用于网络请求库中,提高了代码的可维护性和复用性。 Swift中的Swizzling是一种元编程技术,它允许你在运行时改变方法的实现。Swift-Bridge可能利用了这种...

    26种设计模式-----pdf

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板。这个压缩包文件名为"26种设计模式",其中可能详细介绍了软件开发中的26个核心设计模式。这些模式是经过时间检验、被广泛接受并反复使用...

    c++设计模式-结构型模式-桥接模式

    c++设计模式-结构型模式-桥接模式;qt工程,c++简单源码; 桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度...

    C++设计模式-好书

    ### C++设计模式精解 #### 一、引言 设计模式是软件工程领域中一个非常重要的话题,它为解决常见的软件设计问题提供了标准化的方法。本书《C++设计模式》聚焦于GoF(Gang of Four)所提出的23种设计模式,并通过...

    GOF-设计模式-Design Patterns-英文原版-高清-有目录-有页码

    ### GOF设计模式详解 #### 一、设计模式概述 **设计模式**(Design Patterns)是软件工程中的一个重要概念,它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。本章节将从多个角度对设计模式...

    C#设计模式-C#设计模式

    在软件开发领域,设计模式是经过时间和实践验证的解决方案,用于解决常见的编程问题。C#设计模式是将这些通用解决方案应用于C#编程语言的具体实践。本文将深入探讨C#中的几种重要设计模式,并阐述它们的核心概念、...

    23种 设计模式---面向对象的基本原则

    设计模式是软件工程中的一种最佳实践,它们是解决常见编程问题的经验总结,为软件开发提供了可复用的解决方案。在面向对象编程中,设计模式基于一些基本原则,这些原则构成了良好设计的基础。本篇将深入探讨23种设计...

    设计模式-可复用面向对象软件的基础

    《设计模式-可复用面向对象软件的基础》这本书是面向对象编程领域中的一部经典之作。设计模式,作为软件工程中的重要概念,是解决常见问题的成熟解决方案的模板,它在实践中被反复验证并广泛接受。这本书深入浅出地...

    设计模式-基于C#的工程化实现及扩展

    设计模式是软件工程中的一种最佳实践,它是在特定情境下为解决常见问题而形成的一套可复用的解决方案模板。本资料"设计模式-基于C#的工程化实现及扩展"着重探讨如何在C#编程环境中高效地应用设计模式,并对其进行...

Global site tag (gtag.js) - Google Analytics