Scala设计模式Part II. 结构化模式———2.桥接模式

原创 2016年05月30日 22:42:52

意图

从实现中分离抽象,使得两者都可以独立变化。

桥接模式可以避免抽象与其实现之间的永久绑定。桥接模式对于一系列可扩展类非常重要,一般来说从一个类层次定义若干核心抽象,通过继承具体实现,每个都需要不同的实现。典型的例子是UI框架的窗口抽象。核心抽是窗口,它被子类具体实现。然后每个子类又被不同平台相应的窗口子类继承,这导致了子类的增生。这创建了抽象和实现之间永久的绑定,使得系统硬性绑定在一起。抽象的改变会导致所有子类的改变。解决方法是把类层次分解成为两个独立的层次,一个用于抽象另外一个用于实现。这减少了系统中类的数量,使得每个层次互相独立。下图展示了两个层次直接的关系。

这里写图片描述

Abstraction中所有的操作被Implementor中的抽象方法具体实现。这是两者解耦的关键。

分析

桥接模式本身通过组合和委托实现。抽象包含了指向实现的引用。实现的具体类型通过抽象类隐藏,这种组合实现了解耦,符合了GOF的第二准则(对象组合优于类继承)。

使用组合、委托替代类继承的重构方式,可以使用Scala的self type。这样做的代价是无法在运行时改变绑定。

组件化

在讲适配器模式时,我们讲过无法以一种有意义的方式抽象类之间的通信。抽象和实现层次之间的通信在不同的模式实例中差别巨大。不同实例之间唯一保持相同的是概念层次上的相关角色,这意味着没有可组件化的内容。

Scala方案

在下面代码中,根抽象是Window,它有一个指向根实现的self type叫做WindowImp。

trait Window {
  self:WindowImp=>
  def drawRect(x1:Int,x2:Int,x3:Int,x4:Int) = {
    drawLine(x1,x2)
    drawLine(x1,x3)
    drawLine(x2,x4)
    drawLine(x3,x4)
  }
}

//抽象
trait TransientWindow {
  self:Window=>
  def drawCloseBox = drawRect(4,3,2,1)
}

trait IconWindow {
  self:Window=>
  def drawBorder = drawRect(1,2,3,4)
}

//所有实现的通用接口
trait WindowImp {
  def drawLine(x:Int,y:Int)
}

//实现
trait WindowOSX extends WindowImp {
 def drawLine(x:Int,y:Int)=println("drawing line in OSX")
}

trait WindowVista entends WindowImp {
  def drawLine(x:Int,y:Int)=println("drawing line in Vista")
}

def main(args:Array[String])={
  val windowOSX:Window = new Window with WindowOSX
  windowOSX.drawRect(1,2,3,4)
}

-----
drawing l ine in OSX
drawing l ine in OSX
drawing l ine in OSX
drawing l ine in OSX

我们需要在Window的子类中重复声明自身类型。另外一种较为繁琐的使用自身类型的方式是将定义所需的操作定义为抽象成员。这样更加灵活,因为无需命名具体的特质。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Scala设计模式Part II. 结构化模式———1.适配器

描述适配器模式的意图是: 把一个类的接口转换成客户端期望的另一个接口。适配器可以让彼此不兼容的接口协同工作。 GOF给出了两种基本的适配器实现:类适配器和对象适配器。他们各有优缺点。类适配器使用继...

设计模式(7)-结构型-桥接模式(Bridge)(个人笔记)

概述:将抽象部分与它的实现部分分离,使它们都可以独立地变化。适用性    1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系。      例如这种情况可能是因为,在程序运行时刻实现部分应可以被选...
  • iihero
  • iihero
  • 2012-07-03 20:52
  • 3479

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

设计模式-结构型之桥接模式

模式动机  假设现在让你设计一个画图软件,要求是可以画出不同形状的图形,如圆形,正方形,长方形,三角形等等,同时这些图形还可以进行上色,比如红色,绿色,黄色等等,最终得到一个带有颜色的图形。此时,应该...

设计模式(结构型)之桥接模式(Bridge Pattern)

桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在多个独立变化的维度,通过该模式可以将这多个维度分离出来,使他们可以独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不同,它将多个独...

JAVA设计模式(07):结构型-桥接模式(Bridge)

在正式介绍桥接模式之前,我先跟大家谈谈两种常见文具的区别,它们是毛笔和蜡笔。假如我们需要大中小3种型号的画笔,能够绘制12种不同的颜色,如果使用蜡笔,需要准备3×12 = 36支,但如果使用毛笔的...

JAVA设计模式(07):结构型-桥接模式(Bridge)

GOF 在《设计模式》中给桥梁模式的定义为:将抽象部分与它的实现部分分离,使它们都可以独立地变化。这里的抽象部分和实现部分不是我们通常认为的父类与子类、接口与 实现类的关系,而是组合关系。也就是说,实...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)