`
bill_sbia
  • 浏览: 156192 次
  • 性别: 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模式的精髓所在了,还有……”

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

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

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

相关推荐

    设计模式(16)-Bridge.pdf

    设计模式(16)-Bridge.pdf

    C#设计模式-吕震宇

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

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

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

    设计模式--C++

    1.1 什么是设计模式 2 1.2 Smalltalk MVC 中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...

    JAVA设计模式-day2.pdf

    JAVA设计模式-day2,请的行业大能讲得课程,涉及:创建模式(5种: 1、 工厂方法模式(Factory Method); 2、 抽象工厂模式; 3、 单例模式(Singleton) • 4、 建造者模式(Builder); 5、 原型模式(Prototype...

    head first 设计模式-设计模式必读

    至于第14章则很快地浏览尚未介绍的设计模式,包括Bridge、Builder、Chain of Responsibility、Flyweight、Interpreter、Mediator、Memento、Prototype,Visitor。第1章还介绍了四个○○基本概念(抽象、封装、继承、...

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

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

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

    1.2 Smalltalk MVC中的设计模式 1.3 描述设计模式 1.4 设计模式的编目 1.5 组织编目 1.6 设计模式怎样解决设计问题 1.7 怎样选择设计模式 1.8 怎样使用设计模式 第二章 实例研究:设计一个文档编辑器 2.1 设计问题...

    研磨设计模式-part2

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式-part4

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式-part3

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    设计模式精解-GoF 23种设计模式解析

    设计模式精解-GoF 23 种设计模式解析附 C++实现源码 目 录 引 言 0.1 设计模式解析(总序) 0.2 设计模式解析后记 0.3 与作者联系 1 创建型模式 1.1 Factory模式 1.2 AbstactFactory模式 1.3 Singleton...

    设计模式精解-GoF 23 种设计模式解析附 C++实现源码.pdf

    设计模式精解- GoF 23 种设计模式解析附 C++实现源码 目 录 0 引言 ...........................................................................................................................................

    设计模式之Bridge模式

    Bridge模式是对抽象和具体的进一步抽象。假设你有一个抽象类,一个具体类,现在需要将两者的变化都考虑进去,这就需要bridge。这是经典设计模式中唯一的可以同时处理抽象和具体同时变化的设计模式

    JAVA设计模式chm文档

    设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制) 设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计...

    设计模式Bridge学习

    针对设计模式中的 bridge 模式,做了一个小例子,希望对设计模式研究的朋友有所帮助。

    设计模式C++学习之桥梁模式(Bridge)

    设计模式C++学习之桥梁模式(Bridge)

    36种最新设计模式整理

    36种最新设计模式整理 Design Pattern: Simple Factory 模式 Design Pattern: Abstract Factory 模式 Design Pattern: Builder 模式 Design Pattern: Factory Method 模式 Design Pattern: Prototype 模式 ...

    java版本二十三种设计模式.zip

    - 23种设计模式 - 工厂方法模式(Factory Method) - 抽象工厂模式(Abstract Factory) - 单例模式(Singleton) - 建造者模式(Builder) - 原型模式(Prototype) - 代理模式(Proxy) - 适配器模式(Adapter) - 装饰...

    软件设计模式 bridge模式 代理模式等

    软件设计模式,共包含二十多种模式,做IT的必备知识呀!

Global site tag (gtag.js) - Google Analytics