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

原创 2016年05月30日 21:49:58

描述

适配器模式的意图是:

把一个类的接口转换成客户端期望的另一个接口。适配器可以让彼此不兼容的接口协同工作。

GOF给出了两种基本的适配器实现:类适配器和对象适配器。他们各有优缺点。

类适配器使用继承实现一个类到另一个类的适配。如下图所示适配器类继成了Adaptee和适配目标Target接口。客户端在适配目标类上调用具体的操作时,适配器类会从被适配的类中调用相应的继承方法。继承可以通过重载方法补充被适配类的行为,但是这样适配器类建立了与被适配类之间静态的依赖关系。这意味着适配器类不能被被适配类的子类重用。

这里写图片描述

对象适配器使用组合/代理而非继承作为适配实现的主要机制。如下图所示,Adapter类包含了一个指向被适配类的引用。客户端调用Request方法时,消息被传递给被适配类的对象。因为适配器只包含了一个指向被适配类的引用,所有它没有与其他类之间的静态依赖,适配器类可以被被适配类的子类重用。但代价是引入了自身问题(self problem),并且不能重载被适配类的行为。

这里写图片描述

两种适配器方式对客户端是透明的,客户端只使用目标接口处理他们想要适配的被适配接口。

分析

考虑对象适配器,上述第二种适配器方式更有效。
明确的自类型(self type)能消除继承适配器带来的适配器和具体被适配类之间依赖的问题。一种更加灵活的方式是用抽象成员声明所需的方法而非自类型。组合混入可以构建一个双重适配器,因为构建的复合类型可对目标类和被适配类都实现适配器功能。另外,这也消除了自身问题。

综合上述特性增强了GOF的两种模式方案,但是不能再运行时改变被适配的类,在某些场景下这是很重要的。

组件化

每次实例化不同的地方是适配器、被适配类的类型以及他们之间的通信。通信一般通过所涉一系列方法实现。在Scala中没有方式实现对一系列类成员的抽象,这意味着我们不能提供可用的组件。

适配器可被被适配类的任何子类复用,但是这也是有模式适用的特定上下文背景。

Scala解决方案

Scala方案结合了类适配器和对象适配器的优点,同时也有双重适配器的功能。下面代码是一个简单的例子。模式的关键是Adapter特质。它定义了明确的自类型——复合类型Target with Adapter,消除了适配器对被适配类的依赖。

trait Target {
  def Request 
}

class Adaptee {
  def SpecificRequest = println("Specific Request!")
}

trait Adapter {
  self : Target with Adaptee=>
  def Request()=self.SpecificRequest()
}

def main(args:Array[String])= {
  val adapter=new Adaptee with Target with Adapter
  adapter.Request
  adapter.SpecificRequest
}

main方法展示了如何使用适配器。它可以调用Request和SpecificRequest方法,证明其可以处理双重适配器。

总结

Scala方案结合了类适配器和对象适配器所有的优点,消除了自身问题。自类型的使用消除了对特定被适配类的依赖。另一种方案是在适配器类中声明抽象成员,这样能增加灵活性,因为只引入了结构上的依赖。这种方案仅有部分基于组合的灵活性,同时也说明在应用于Scala时没有第一种强大。因为无法抽象类的成员集合,所以无法组件化。

与GOF方案相比,Scala方案有如下特点:

  • 没有self problem,但是几乎与对象适配器一样灵活
  • 与类适配器相比,没有对特定被适配类的依赖
  • 只适用于不需要动态改变被适配类的情况
版权声明:本文为博主原创文章,未经博主允许不得转载。

Scala学习回顾(六)---- Scala中的继承:超类的构造、重写字段、重写方法

注:本文学习源自:DT大数据梦工厂(微信公众号:DT_Spark) 类有一个主构器和任意数量的辅助构造器,而每个辅助构造器都必须以对先前定义的辅助构造器或主构造器的调用开始。子类的辅助构造器最终...

scala的继承、组合与特质trait

scala可以在子类的构造器中重写父类的属性,例如: abstract class Element { def contents:Array[ String] val height:Int = con...

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

意图 从实现中分离抽象,使得两者都可以独立变化。 桥接模式可以避免抽象与其实现之间的永久绑定。桥接模式对于一系列可扩展类非常重要,一般来说从一个类层次定义若干核心抽象,通过继承具体实现,每个都需要...
  • xxfigo
  • xxfigo
  • 2016年05月30日 22:42
  • 413

java设计模式-结构化模式:适配器模式

java的适配器模式基本上分为l

Scala设计模式Part I. 创建模式——1.抽象工厂

Part I. 创建模式1. 抽象工厂描述 抽象工厂的目的是为创建一系列相关或者依赖的对象提供一个接口,而不用指定具体的类 例如我们要开发一个可以兼容不同OS平台GUI库,为了能够为图形窗口提供统...
  • xxfigo
  • xxfigo
  • 2016年05月23日 15:34
  • 623

设计模式结构型-适配器

  • 2015年01月19日 18:59
  • 2.94MB
  • 下载

结构型设计模式(1):适配器模式

定义 适配器模式(英语:adapter pattern)有时候也称包装样式或者包装。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类工作在一起。 有两类适...

设计模式学习(十六)————适配器模式

适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作注意:如果能事先将软件的接口设计为相同,就尽量不用适配器模式,只有确实...

Java设计模式————适配器模式

适配器模式(别名:包装器)              将一个类的接口转换成客户希望的另外一个借口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。           ...

23种设计模式 第二部分 结构模式(1) 适配器模式

理解 适配器模式是将某个类的接口,转换成需要的另一些接口。说白了,其实就是接口的转换工作,这个有点像是usb转为其他接口的转换器。  目的是消除两个接口的不兼容性。 比如,之前我的台式机耳机坏了,用了...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Scala设计模式Part II. 结构化模式———1.适配器
举报原因:
原因补充:

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