七、适配器(Adapter)模式--结构模式(Structural Pattern)
适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作。
类的 Adapter模式的结构:
类适配器类图:

由图中可以看出,Adaptee 类没有 Request方法,而客户期待这个方法。为了使客户能够使用 Adaptee 类,提供一个中间环节,即类Adapter类,
Adapter 类实现了 Target 接口,并继承 自 Adaptee,Adapter 类的 Request 方法重新封装了Adaptee 的SpecificRequest方法, 实现了适配的目的。
因为 Adapter 与 Adaptee 是继承的关系,所以这决定了这个适配器模式是类的。
该适配器模式所涉及的角色包括:
目标(Target)角色:这是客户所期待的接口。因为 C#不支持多继承,所以 Target 必须是接 口,不可以是类。
源(Adaptee)角色:需要适配的类。
适配器(Adapter)角色:把源接口转换成目标接口。这一角色必须是类。
示例代码:
class Program
{
static void Main(string[] args)
{
ITarget t = new Adapter();
t.Request();
Console.ReadKey();
}
} interface ITarget
{
void Request();
} class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine(" Call SpecificRequest();");
}
} class Adapter : Adaptee, ITarget
{
public void Request()
{
this.SpecificRequest();
}
}
运行结果:

对象的 Adapter模式的结构:
对象的Adapter模式类图:

从图中可以看出:客户端需要调用 Request方法,而Adaptee 没有该方法,为了使客户端能 够使用 Adaptee 类,需要提供一个包装(Wrapper)类 Adapter。
这个包装类包装了一个 Adaptee 的实例,从而将客户端与 Adaptee 衔接起来。由于 Adapter 与 Adaptee 是委派关 系,这决定了这个适配器模式是对象的。
该适配器模式所涉及的角色包括:
目标(Target)角色:这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
源(Adaptee)角色:需要适配的类。
适配器(Adapter)角色:通过在内部包装(Wrap)一个 Adaptee 对象,把源接口转换成目 标接口。
示例代码:
class ObjectAdapter
{
public static void Main(string[] args)
{
Target t = new Adapter();
t.Requtest();
Console.ReadKey();
}
} public class Target
{
virtual public void Requtest()
{ }
} class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("Call Adaptee.SpecificRequest();");
}
} public class Adapter : Target
{
Adaptee adaptee = new Adaptee();
public override void Requtest()
{
adaptee.SpecificRequest();
}
}
运行结果:

在以下各种情况下使用适配器模式:
1、 系统需要使用现有的类,而此类的接口不符合系统的需要。
2、 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可 能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
3、 (对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式, 就要针对每一个子类做一个适配器,而这不太实际。
Adapter模式在实现时有以下这些值得注意的地方:
1、 目标接口可以省略,模式发生退化。但这种做法看似平庸而并不平庸,它可以使Adaptee 不必实现不需要的方法(可以参考 Default Adapter 模式)。其
表现形式就是父类实现缺省方 法,而子类只需实现自己独特的方法。这有些像模板(Template)模式。
2、 适配器类可以是抽象类。
3、 带参数的适配器模式。使用这种办法,适配器类可以根据参数返还一个合适的实例给客户端。
七、适配器(Adapter)模式--结构模式(Structural Pattern)的更多相关文章
- 十二、享元(Flyweight)模式--结构模式(Structural Pattern)
Flyweight在拳击比赛中指最轻量级,即"蝇量级",有些作者翻译为"羽量级".这里使用"享元 模式"更能反映模式的用意. 享元模式以共享 ...
- 九、 合成(Composite)模式 --结构模式(Structural Pattern)
合成模式:有时又叫做部分-整体模式(Part-Whole).合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 合成模式分为安全式和透明式 ...
- 十一、外观(Facade)模式--结构模式(Structural Pattern)
外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式.门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行. 门面模式提供一个高层次 ...
- 十、装饰(Decorator)模式 --结构模式(Structural Pattern)
装饰(Decorator)模式又名包装(Wrapper)模式[GOF95].装饰模式以对客户端透明的方 式扩展对象的功能,是继承关系的一个替代方案. 装饰模式类图: 类图说明: 抽象构件(Compon ...
- 八、桥接模式--结构模式(Structural Pattern)
桥梁模式:将抽象化(Abstraction)与实现化 (Implementation)脱耦,使得二者可以独立地变化. 桥梁模式类图: 抽象化(Abstraction)角色:抽象化给出的定义,并保存 一 ...
- 结构型模式概述(Structural Pattern)
结构型模式可以描述两种不同的东西:类与类的实例.结构型模式可以分为类结构型模式和对象结构型模式. 类结构型模式关心类的组合,可以由多个类组合成一个更大的系统,在类结构型模式中只存在继承关系和实现关系: ...
- 设计模式のCompositePattern(组合模式)----结构模式
一.产生背景 又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式,它创建了对象组的树形结构. 这种模 ...
- 【原】模式之-适配器Adapter模式
适配器Adapter模式 适配器模式(Adapter Pattern)把一个类的接口变换成客户端所期待的的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 模式所涉及的角色有 ...
- 设计模式模式适配器(Adapter)摘录
23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助建立一个系统,是独立于如何.这是一个这些对象和陈述的组合.创建使用继承一个类架构更改实例,一个对象类型模 ...
随机推荐
- Micro Python - Python for microcontrollers
Micro Python - Python for microcontrollers MicroPython
- Java应用开发的一条经验
一旦为应用建立良好的基础设施, 后续的开发就会变得容易而快速. 这些基础设施包括: 1. 线程池的建立.配置: 在 JDK 并发库的基础上建立更适合于应用的并发使用接口: 2. 跨多数据源的 ...
- MySQL的备份和还原
MySQL的备份和还原 备份:副本 RAID1,RAID10:保证硬件损坏而不会业务中止: DROP TABLE mydb.tb1; 备份类型: 热备份.温备份和冷备 ...
- string字母排序,
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- H Language Blueprint
H Language Blueprint I will design the H language in the very-soon future, it will be like: 1- a scr ...
- xcode 执行时模拟器不可选的问题
好久没写博客了,上一次是什么时候都想不起来了. 之前总认为脑袋记住了,用过了就能够了,干嘛要写博客,简直浪费时间.事实上没事写写博客优点还是挺多的.这样既能够对自己用过的和学到的东西做一个总结,也能提 ...
- CGBitmapContextCreate函数
CGBitmapContextCreate函数参数详解 函数原型: CGContextRef CGBitmapContextCreate ( void *data, size_t width, ...
- phonegap环境配置与基本操作
一.开发环境配置: 1.工具环境安装: 安装java sdk 1.6以上版本号,Android Development Tools.ant,系统变量 Path后面加入 新增名稱 JAVA_HOME 值 ...
- Android编译过程详解(二)
通过上篇文章,我们分析了编译android时source build/envsetup.sh和lunch命令,在执行完上述两个命令后, 我们就可以进行编译android了. 1. make 执行ma ...
- js keycode 列表
keycode 8 = BackSpace BackSpace keycode 9 = Tab Tab keycode 12 = Clear keycode 13 = Enter ...