索引

别名

  • 包装器(Wrapper)

意图

将一个类的接口转换成客户希望的另外一个接口。

Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

Convert the interface of a class into another interface clients expect.

Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.

结构

类适配器使用多重继承对一个接口与另一个接口进行匹配。

对象适配器依赖于对象组合。

参与者

Target

  • 定义 Client 使用的与特定领域相关的接口。

Client

  • 与符合 Target 接口的对象协同。

Adaptee

  • 定义一个已经存在的接口,这个接口需要适配。

Adapter

  • 对 Adaptee 的接口与 Target 接口进行适配。

适用性

在以下情况下可以使用 Adapter 模式:

  • 你想使用一个已经存在的类,而它的接口不符合你的需求。
  • 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作。
  • 你想使用一些已经存在的类,但是不可能对每一个都进行子类化匹配它们的接口。对象适配器可以适配它的父类的接口。

效果

  • 允许一个 Adapter 与多个 Adaptee (Adaptee 本身及它的子类)同时协同。Adapter 也可以一次给所有的 Adaptee 添加功能。
  • 使得重定义 Adaptee 的行为比较困难。这就需要生成 Adaptee 的子类并且使得 Adapter 引用这个子类而不是引用 Adaptee 自身。

相关模式

  • Bridge模式的结构与对象 Adapter 模式类似,但是 Bridge 模式的出发点不同:Bridge 目的是将接口部分和实现部分分离,从而对它们可以较为容易也相对独立的加以改变。而 Adapter 则意味着改变一个已有对象的接口。
  • Decorator模式增强了其他对象的功能而同时又不改变它的接口。因此 Decorator 对应用程序的透明性比 Adapter 要好。结果是 Decorator 支持递归组合,而 Adapter 无法实现这一点。
  • Proxy模式在不改变它的接口的条件下,为另一个对象定义了一个代理。

实现

实现方式(一):简单直接的对象适配器。

 namespace AdapterPattern.Implementation1
{
public class ParentAdaptee
{
public virtual string SpecificRequest()
{
return "ParentAdaptee";
}
} public class ChildAdaptee : ParentAdaptee
{
public override string SpecificRequest()
{
return "ChildAdaptee";
}
} public class Target
{
public virtual string Request()
{
return "Target";
}
} public class Adapter : Target
{
private ParentAdaptee _adaptee; public Adapter(ParentAdaptee adaptee)
{
_adaptee = adaptee;
} public override string Request()
{
return _adaptee.SpecificRequest();
}
} public class Client
{
public void TestCase1()
{
ParentAdaptee adaptee = new ChildAdaptee();
Target target = new Adapter(adaptee);
var result = target.Request();
}
}
}

实现方式(二):实现双向类适配器。

 namespace AdapterPattern.Implementation2
{
public class ParentAdaptee
{
public virtual string SpecificRequest()
{
return "ParentAdaptee";
}
} public class ChildAdaptee : ParentAdaptee
{
public override string SpecificRequest()
{
return "ChildAdaptee";
}
} public interface ITarget
{
string Request();
} public class Adapter : ChildAdaptee, ITarget
{
public Adapter()
{
} public string Request()
{
return base.SpecificRequest();
}
} public class Client
{
public void TestCase2()
{
ITarget target = new Adapter();
var result = target.Request();
}
}
}

《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。

设计模式之美:Adapter(适配器)的更多相关文章

  1. Ruby设计模式透析之 —— 适配器(Adapter)

    转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/9400153 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...

  2. 设计模式之美:Structural Patterns(结构型模式)

    结构型模式涉及到如何组合类和对象以获得更大的结构. 结构型类模式采用继承机制来组合接口实现. 结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法. 因为 ...

  3. 设计模式之美:Extension Object(扩展对象)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用示例结构实现 Extension Object. 实现方式(二):使用泛型实现 IExtensibleObject<T ...

  4. 设计模式之美:Proxy(代理)

    索引 别名 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用相同 Subject 接口实现 Proxy. 别名 Surrogate 意图 为其他对象提供一种代理以控制对这个对象的 ...

  5. 设计模式之美:Decorator(装饰)

    索引 别名 意图 结构 参与者 适用性 缺点 效果 相关模式 实现 实现方式(一):Decorator 对象的接口必须与它所装饰的 Component 的接口保持一致. 实现方式(二):省略抽象的 D ...

  6. 设计模式之美:Bridge(桥接)

    索引 别名 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用 Bridge 模式分离抽象部分和实现部分. 别名 Handle Body 意图 将抽象部分与它的实现部分分离,使它们 ...

  7. Android中ListView 控件与 Adapter 适配器如何使用?

    一个android应用的成功与否,其界面设计至关重要.为了更好的进行android ui设计,我们常常需要借助一些控件和适配器.今天小编在android培训网站上搜罗了一些有关ListView 控件与 ...

  8. 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)

    原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabc ...

  9. 8.3 GOF设计模式二: 适配器模式 Adapter

    GOF设计模式二: 适配器模式 Adapter  为中国市场生产的电器,到了美国,需要有一个转接器才能使用墙上的插座,这个转接 器的功能.原理?复习单实例模式  SingleTon的三个关键点  ...

随机推荐

  1. windows命令行(Command Prompt / Console)字体设置

    1.运行 regedit 打开注册表编辑器,打开注册表定位至[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Conso ...

  2. 主机名链接数据库,无法生成 SSPI 上下文

    两台Server,环境一样,都使用同一域账号. 1的SQL Server可以通过Windows认证连接到2,但2通过Windows认证连接1时报如下错误: 目标主体名称不正确,无法生成 SSPI 上下 ...

  3. docker中安装ssh服务

    系统:Debian Docker 目标:在docker(debian系统)中安装ssh服务,实现远程登陆和控制docker 步骤: 初始状态:通过docker pull debian得到的一个debi ...

  4. dmesg

    在开机的时候你会发现有很多的讯息出现吧,例如 CPU 的形式.硬盘. 光盘型号及硬盘分割表等等,这 些信息的产生都是核心 (kernel) 在进行硬件的测试与驱动啦.要看这些讯息你可以用 dmesg  ...

  5. char *p 与char p[] 比较

    看看下面的程序的输出: #include <stdio.h>char *returnStr(){    char *p="hello world!";    retur ...

  6. 一个PHP日历程序

    <?php  //<-------处理通过GET方法提交的变量;开始-------->  if($HTTP_GET_VARS[year]=="")  {      ...

  7. SQL SERVER 批量插入记录

    --create function insertData(@count as int,@tsn as bigint,@id as int) --as --begin SET IDENTITY_INSE ...

  8. 界面设计常用CSS属性

    CSS常用属性整理: 1 字体属性 font-family 设置使用的字体 font-style 设置字体的样式,是否斜体 font-variant 设置字体的大小写 font-weight 设置字体 ...

  9. Installshield 打包安装包心得

     制作简单的安装软件 声明:下面的教程,是把读者当做完全没接触过IS的角度来制作的. 1. 启动InstallShield 12.建立一个InstallShield MSI Project,如图: 2 ...

  10. jQuery.bind() 函数详解

    bind()函数用于为每个匹配元素的一个或多个事件绑定事件处理函数. 此外,你还可以额外传递给事件处理函数一些所需的数据. 执行bind()时,事件处理函数会绑定到每个匹配元素上.因此你使用bind( ...