博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之美:Adapter(适配器)
阅读量:5922 次
发布时间:2019-06-19

本文共 2788 字,大约阅读时间需要 9 分钟。

索引

别名

  • 包装器(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 自身。

相关模式

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

实现

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

1 namespace AdapterPattern.Implementation1 2 { 3   public class ParentAdaptee 4   { 5     public virtual string SpecificRequest() 6     { 7       return "ParentAdaptee"; 8     } 9   }10 11   public class ChildAdaptee : ParentAdaptee12   {13     public override string SpecificRequest()14     {15       return "ChildAdaptee";16     }17   }18 19   public class Target20   {21     public virtual string Request()22     {23       return "Target";24     }25   }26 27   public class Adapter : Target28   {29     private ParentAdaptee _adaptee;30 31     public Adapter(ParentAdaptee adaptee)32     {33       _adaptee = adaptee;34     }35 36     public override string Request()37     {38       return _adaptee.SpecificRequest();39     }40   }41 42   public class Client43   {44     public void TestCase1()45     {46       ParentAdaptee adaptee = new ChildAdaptee();47       Target target = new Adapter(adaptee);48       var result = target.Request();49     }50   }51 }

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

1 namespace AdapterPattern.Implementation2 2 { 3   public class ParentAdaptee 4   { 5     public virtual string SpecificRequest() 6     { 7       return "ParentAdaptee"; 8     } 9   }10 11   public class ChildAdaptee : ParentAdaptee12   {13     public override string SpecificRequest()14     {15       return "ChildAdaptee";16     }17   }18 19   public interface ITarget20   {21     string Request();22   }23 24   public class Adapter : ChildAdaptee, ITarget25   {26     public Adapter()27     {28     }29 30     public string Request()31     {32       return base.SpecificRequest();33     }34   }35 36   public class Client37   {38     public void TestCase2()39     {40       ITarget target = new Adapter();41       var result = target.Request();42     }43   }44 }

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

你可能感兴趣的文章
励志前行,加速BCH创新落地
查看>>
使用 postman 调试 jwt 开发的接口
查看>>
Xcode可删除文件列表
查看>>
使用SAPGUI画图
查看>>
Event loop (JavaScript中的执行机制)
查看>>
iOS新建推送证书无法生成p12文件的解决办法
查看>>
动态索引之B树和B+树
查看>>
高效开发者是如何个性化VS Code插件与配置的?
查看>>
JavaScript模块化
查看>>
passportjs 源码分析
查看>>
程序员提升学习效率的3个方法,影响过整个世界进程!
查看>>
CSS 选择器
查看>>
目前可用的微博秀的嵌入方法大全(亲测2019年2月仍有效)
查看>>
2019年微服务5大趋势,你pick哪个?
查看>>
CNCF案例研究:京东
查看>>
JS中数据类型、内置对象、包装类型对象、typeof关系
查看>>
对是否要用Linux的思考
查看>>
TypeScript--安装依赖,vscode配置ts自动转换成js文件
查看>>
SpiderData 2019年2月15日 DApp数据排行榜
查看>>
Core dump调试小记(暂时未解决)
查看>>