`

(转)设计模式(Design Patterns)笔记之三:Bridge yakuu [原作]

 
阅读更多

前言:不好意思,前段时间由于各方面的原因,没顾上写了。这就加油补上。^_^

概念:
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模式的精髓所在了,还有……”

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

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

“哇,你这么了解我啊。”“去死吧你……”“哈哈哈!!!”

分享到:
评论

相关推荐

    Machine Learning Design Patterns

    《Machine Learning Design Patterns》是一本关于机器学习设计模式的书籍,作者是Valliappa Lakshmanan, Sara Robinson和Michael Munn。该书的主要内容是解决数据准备、模型构建和MLOps中的常见挑战。 在数据准备...

    Design Patterns in Modern C++

    Design Patterns in Modern C++: Reusable Approaches for Object-Oriented Software Design English | PDF| 2018 | 312 Pages | ISBN : 1484236025Design Patterns in Modern C++: Reusable Approaches for Object...

    《设计模式》中文版 Design Patterns

    设计模式 中文版 Design Patterns 可复用面向对象软件基础 经典之作 内含23个设计模式

    设计模式:可复用面向对象软件的基础(中文)Design Patterns:Elements of Reusable Object-Oriented software

    设计模式:可复用面向对象软件的基础(中文)Design Patterns:Elements of Reusable Object-Oriented software

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

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

    Design Patterns Explained A New Perspective on Object Oriented Design

    4. **设计模式分类**:设计模式通常分为三类:创建型模式(如单例模式、抽象工厂模式等)、结构型模式(如代理模式、装饰器模式等)和行为型模式(如策略模式、职责链模式等)。每种模式都有其特定的用途和应用场景...

    设计模式(Design Patterns)中译本.rar

    设计模式是软件工程领域中的重要概念,源自于1994年由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位杰出的软件工程师合著的经典书籍《设计模式:可复用面向对象软件的基础》(Design Patterns: ...

    Head First Design Patterns(深入浅出设计模式)中文版PDF完整超清带目录

    又名: Head First Design Patterns 作者: (美)弗里曼(Freeman,E.) 副标题: Head First Design Patterns 简介 ······ 你不想重新发明车轮(或者更差的是,没有充气车胎的轮子),所以你从设计模式中寻求...

    Common Design Patterns for Symbian OS: The Foundations of Smartphone Software

    Common Design Patterns for Symbian OS: The Foundations of Smartphone Software Paperback: 444 pages Publisher: Wiley (December 3, 2008) Language: English ISBN-10: 0470516356 ISBN-13: 978-0470516355 ...

    Design Patterns(Structural):Facade

    设计模式(结构型):外观模式 外观模式(Facade Pattern)是一种常用的软件设计模式,在面向对象编程中,它为子系统中的一组接口提供一个统一的高层接口,使得这一子系统更加容易使用。外观模式定义了一个高层接口...

    MongoDB应用设计模式:MongoDB Applied Design Patterns

    《MongoDB应用设计模式:MongoDB Applied Design Patterns》这本书深入探讨了在实际开发中如何有效地利用MongoDB的优势来构建高效、可靠且易于维护的数据存储解决方案。 在设计模式方面,书中可能涵盖了以下关键...

    设计模式(Design Patterns).pdf

    设计模式主要分为三大类,分别是创建型模式、结构型模式和行为型模式。此外,还有并发型模式和线程池模式,但在这里不做具体讲解。 1. 创建型模式:主要解决对象的创建问题,目的是创建型模式在不暴露创建逻辑的...

    Design Patterns for Embedded Systems in C

    通过学习《Design Patterns for Embedded Systems in C》,读者能够了解如何在C语言的约束下运用设计模式来解决嵌入式系统开发中遇到的问题,提高嵌入式软件的开发效率和系统性能,减少错误,缩短开发周期。

    《Java Design Patterns》高清完整英文PDF版

    Learn how to implement design patterns in Java: each pattern in Java Design Patterns is a complete implementation and the output is generated using Eclipse, making the code accessible to all....

    Vue.js Design Patterns and Best Practices

    Vue.js Design Patterns and Best Practices Vue.js Design Patterns and Best Practices

    设计模式Design Patterns

    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 指定对象...

    读书笔记:design patterns 图解设计模式.zip

    读书笔记:design patterns 图解设计模式

    GO语言设计模式 go-design-patterns

    Go Design Patterns will provide readers with a reference point to software design patterns and CSP concurrency design patterns to help them build applications in a more idiomatic, robust, and ...

    Head First Design Patterns(中文版)设计模式 java

    Head First Design Patterns(中文版)设计模式 java。 Head First Design Patterns(中文版) 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除 设计模式 ...

    JAVA设计模式(Design Patterns)

    在Java中,有23种经典的设计模式,这些模式通常被分为三大类:创建型、结构型和行为型。 **创建型模式**关注对象的创建过程,旨在确保对象的创建过程与使用场景解耦。包括: 1. **工厂方法模式**(Factory Method...

Global site tag (gtag.js) - Google Analytics