简述
模式 Adapter(适配器)又称为 Wrapper(包装器),它的提出是为了协调那些功能可复用但接口格式不相称的代码场景。
第一个场景
假设需要开发一款在线的电子白板软件,电子白板软件需要能够绘制各种图像及编辑文本。绘制功能对应的主要抽象是一组图像对象,如直线(LineShape)、矩形(RectangleShape)、 椭圆(OvalShape)、文本(TextShape)……,每个图像对象兼具图像算法和图像绘制职责。
基础几何图像对象(如直线、矩形)是很容易实现的,但文本对象就比较复杂了,其中涉及到了文字格式、段落格式、屏幕更新、缓存管理等诸多内容。如果此时正好有一个成熟的文本绘制工具包可供使用,这个工具包中的TextView对象提供了完整的文本格式、段落、屏幕及缓存管理,实现了TextShape对象需要实现的一些职责。
是否可复用呢?如何复用?
- 从TextView中硬拷贝代码显然是不可取的,先不说代码重复的问题,TextShape对象的实现本身会依赖同包中的其它代码,而这些代码又不全是对外权限公开的,如果把所依赖的私有代码再硬拷贝过来,那么所依赖的私有代码还会再依赖另外的私有代码,一生二,二生三,三生万物……这将是一场灾难。
- 如果在工具包中直接修改TextView的代码就不会有权限问题了。但这种将上层逻辑移至底层依赖的做法是极其不推荐的。造成的结果是电子白板代码混乱、工具包代码混乱,而且对工具包中代码的直接修改很有可能引起工具包代码的本身不稳定。如果工具包的发布者提供了重要的版本升级,升级的内容也很难被引入到电子白板中。
- 将TextView对象引入到TextShape中,在TextShape中酌情变通使用是可行的。这样做的问题在于TextShape中难免会出现一组为协调TextView和TextShape差异所写的代码,这样的代码会使TextView变形。
既然这样,我们可以定义一个TextApapter对象,它负责TextView和TextShape之间的差异协调。TextShape用TextAdapter(继承或组合),TextAdapter用TextView(继承或组合)。关系如下图:
这种结构,实际上就是Adapter模式。当然,如果TextAdapter本身需要做的事情很少,也可以直接用TextShape兼职Adaper。
结构
一、类适配器 && 对象适配器
上例中通过继承实现Adaper模型(TextShape继承TextAdapter,TextAdapter继承TextView),也可以通过组合的方式实现。这两种方式也被称为Class Adapter(类适配器)和Object Adapter(对象适配器)。以下用类图描述这两种结构:
1. 类适配器
2. 对象适配器
不同于类适配器,对象适配器使用的是组合的方式代替了继承(Adapter有指向Adaptee的引用,而不是Adapter继承Adaptee)。
二、类适配器 Vs. 对象适配器
1. 类适配器
- 因为Adapter是Adaptee的子类,所以,对于类似Java这样不支持多重继承的语言,类适配器无法做到适配多Adaptee。
- Adapter不需要引入指向Adaptee的引用/指针。
- 作为Adaptee的子类,Adapter自动从Adaptee继承属性和方法,不需要显示调用。
- Adapter可从Adaptee继承权限为public和protected的的属性及方法,而对象适配器仅能使用public元素。
- Adapter客Override Adaptee的方法。
2. 对象适配器
- 因为不需要继承,而是Adapter持有Adaptee的引用,所以一个Adapter可以适配多个Adaptee。
- Adapter需要显示调用Adaptee的方法。
- 仅能使用Adaptee的public方法(假设两者不同包)。
- 不支持Override。
成员
-
Client: 所处的代码环境(在线电子白板)。
-
Target: 满足Client使用要求的功能接口/类(TextShape)。
-
Adaptee:已有的功能匹配但接口形式不匹配的类(TextView)。
-
Adapter:Adaptee和Target的协调者(TextAdatper)。
- 大小: 5.6 KB
- 大小: 6.5 KB
- 大小: 7.9 KB
分享到:
相关推荐
Adapter模式是一种设计模式,主要目的是解决不同接口之间不兼容的问题,使得原本无法协同工作的类能够协同工作。在本文中,我们通过一个形如"形状"的范例来讲解Adapter模式的概念和实现。 首先,我们有一个抽象基类...
Adapter模式是一种结构型设计模式,它允许不兼容的类或接口之间进行通信。在软件开发中,我们常常遇到这样的情况:需要使用一个已经存在的类,但是它的接口与我们的需求不匹配,这时候Adapter模式就能派上用场。它...
设计模式之 适配器 Adapter C++ 源码 vs2019 工具,设计模式之 适配器 Adapter C++ 源码 vs2019 工具,设计模式之 适配器 Adapter C++ 源码 vs2019 工具,设计模式之 适配器 Adapter C++ 源码 vs2019 工具,设计模式...
设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制) 设计模式之Observer ...
设计模式之 Adapter(适配器) 使用类再生的两个方式:组合(new)和继承(extends),这个已经在 thinking in java中提到过. 设计模式之 Proxy(代理) 以 Jive 为例,剖析代理模式在用户级别授权机制上的应用 设计模式之 ...
Java设计模式之Adapter适配器模式 Java设计模式之Adapter适配器模式是一种结构型设计模式,主要用于解决不同接口之间的不兼容问题,使得原本由于接口不兼容不能一起工作的那些类可以一起工作。Adapter模式的主要...
设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制) 设计模式之Observer ...
结构模式:设计模式之Facade(外观),设计模式之Proxy(代理),设计模式之Adapter(适配器),设计模式之Composite(组合),设计模式之Decorator(油漆工),设计模式之Bridge,设计模式之Flyweight(享元). 行为模式:设计模式之...
设计模式是软件开发中的重要概念,它是一种在特定场景下解决问题的通用、可重用的设计方案。设计模式的目的是为了提高代码的可读性、可维护性以及系统设计的灵活性。本文将深入探讨FACADE模式、Adapter模式以及...
适配器模式是软件设计模式中的一种,它的主要目的是解决接口不兼容问题,使得原本由于接口差异无法协同工作的类能够协同工作。在实际的软件开发过程中,我们常常遇到这样的情况:旧有的系统或第三方库提供了丰富的...
介绍24设计模式中的Adapter模式,如果使用,实例讲解,等等
在软件设计领域中,设计模式是解决特定问题的一般性模板。其中适配器模式(Adapter Pattern)是一种经常被用于不同接口或抽象层次之间的解决方案。在JavaScript中,适配器模式的实现有助于将不同的接口统一起来,使...
java中的适配器模式,Adapter设计模式(包装器)23种设计模式之一
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个接口转换为客户端期望的另一个接口。适配器模式常用于解决由于接口不兼容而无法正常工作的类之间的协作问题。 适配器模式的组成 目标接口(Target...
在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...
标题“设计模式之适配器Adapter”暗示我们将深入探讨适配器模式的核心概念和应用场景。适配器模式通常应用于以下场景: 1. 当系统中存在一个已经存在的类,其接口不符合新需求时,可以使用适配器模式来调整接口,使...
《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...
适配器模式(Adapter Pattern)是软件设计模式中的一种,其主要目的是使两个不兼容的接口之间能够协同工作。在IT行业中,我们经常遇到不同系统、库或组件之间的接口不一致,导致它们无法直接交互。适配器模式就提供...