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给出了两种基本的适配器实现:类适配器和对象适配器。他们各有优缺点。类适配器使用继...
  • xxfigo
  • xxfigo
  • 2016年05月30日 21:49
  • 584

结构型设计模式(2):桥接模式

动机 有些时候一个抽象应该有不同的实现,比如,保存数据时有两种方式,一种是文件方式,一种是数据库方式,通常的做法是继承保存数据的类,然后实现不同的保存方式。这样做的问题就是难于修改和扩展保存方式,运...

设计模式学习(二十二)————桥接模式

桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化今天使用不同品牌的手机和在其上面安装不同的应用举例子:#ifndef MOBILE_H #define MOBILE_H#include ...

23种设计模式(7)_结构型_桥接模式(Bridge Pattern)

桥接模式即将抽象部分与实现部分脱耦,使它们可以独立变化。对于上面的问题中,抽象化也就是RemoteControl类,实现部分也就是On()、Off()、NextChannel()等这样的方法(即遥控器...

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

第0章:简介 简单工厂模式定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化 简单工厂模式的实质:分离抽象与实现 参考:http://chjavach.iteye.com/blog/7380...

java结构型设计模式——桥接模式

1、模式理解:桥接模式,那么桥接什么呢,可以把桥接理解为连接,连接两个对象,那么两个对象怎么才能连接上呢,至少要让两个对象存在点关系吧,比方两个人谈恋爱,从得有些关系才好下手吧,总不能大马路上拉个人就...

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

1. 概述       在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Scala设计模式Part II. 结构化模式———2.桥接模式
举报原因:
原因补充:

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