好比,如今一个没有电的手机和一个110V50HZ的插座在你面前,你显然要给手机充电,可是手机只须要5V-1A的输入。这时候怎么办?设计模式
打电话给电厂,把电压给我降下来app
找手机厂商,把个人手机改成220V的输入框架
找个电源适配器ide
结果很显然~spa
适配器用于链接两种不一样种类的对象,使其毫无问题的协同工做。思想很简单,适配器实现客户端所要的某种接口的行为。同时,它又链接到另外一个具备(彻底)不一样接口与行为的对象。一边是客户端懂得如何使用的目标接口,另外一边是客户端一无所知的被适配者,适配器处于二者之间。适配器的主要做用是把被适配者的行为传递给管道另外一端的客户端。设计
已有类的接口与需求不符3d
想要一个可复用的类,该类可以同可能带有不兼容接口的其余类协做。代理
须要适配一个类的几个不一样子类,但是每个子类去子类化一个类适配器又不现实。那么可使用对象适配器(也就是代理)来适配其父类的接口。指针
解耦(适配器里作的事情,就是一个耦合的过程)code
类适配器与对象适配器是实现适配器模式的不一样方式,可是达成了一样的目的。
类适配器 | 对象适配器 |
---|---|
只针对单一的具体Adaptee类,把Adaptee适配到Target | 能够适配多个Adaptee及其子类 |
易于重载Adaptee的行为,由于是经过直接的子类化进行的适配 | 难以重载Adaptee的行为,须要借助于子类的对象而不是Adaptee自己 |
只有一个Adapter对象,无需额外的指针间接访问Adaptee | 须要额外的指针以间接访问Adaptee并适配其行为 |
Target(这是客户所指望的接口。目标能够是具体的或则抽象的类
,也能够是接口
)
class Target { public virtual void Request() { Console.WriteLine("普通请求"); } }
Adaptee(须要适配的类)代码以下:
class Adaptee { public void SepecificRequest() { Console.WriteLine("特殊请求"); } }
Adapter(经过在内部包装一个Adaptee对象,把源接口转换成目标接口),代码以下:
class Adapter : Target { private Adaptee adaptee = new Adaptee(); public override void Request() { adaptee.SepecifiRequest(); } }
客户端端代码以下:
static void Main(String[] args) { Target target = new Adapter(); target.Request(); Console.Read(); }
以UITableView的使用为例:想要把UITableView的接口变换成客户端须要的接口。
这里的客户端是什么呢?其实就是UITableView。
那么此处什么是Target(目标接口)呢?是一个UITableViewDelegate和UITableViewDataSource。
实现协议的具体类(UIViewController)会是个适配器。那什么是与框架不匹配而须要适配的类呢——应用程序(UIViewController)中的其余类。
咱们之因此说委托机制主要是适配器模式,是由于委托机制能够实现某些其余设计模式的意图,好比装饰模式。委托模式的实现有时会跟其余设计模式混在一块儿。
适配器模式的有点不少,如:
将客户端与适配者解耦、使客户端调用更加简明(只须要调用定义的接口方法)。
但一样也有缺点
在写适配器的时候为适应目标接口,可能会有比较复杂实现过程;
无故端多出许多的类,使结构又复杂了一些。