适配器模式(Adaptor)

First Post:

Last Update:

适配器模式(Adaptor)

适配器模式动机

能够使类和对象结合到一起形成更大的结构。

适配器模式结构图

适配器模式结构图

适配器模式成员分析

适配器模式(Adapter)包含以下主要角色。

  1. 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  2. 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  3. 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

适配器模式代码结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
适配器模式代码实现:
/// 客户所期待的接口。目标为具体/抽象的类,也可以是接口
class Target
{
public virtual void Request()
{
Console.WriteLine("普通请求");
}
}

/// 需要适配的类
class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("特殊请求");
}
}

class Adapter : Target
{
private Adaptee adaptee = new Adaptee();//建立一个私有的Adaptee对象
public override void Request()
{
adaptee.SpecificRequest();
//这样可以表面上调用Request()方法
//变成实际调用SpecificRequest()方法
}
}

//客户端
Target target = new Adapter();
target.Request();

适配器模式总结

适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类能够一起工作。

适配器模式主要解决什么问题?

  • 简单地说,就是需要使用的东西完整,但却不能使用,而短时间内又无法改造它,于是我们就想办法适配它。

  • 适配的意思就是使得一个东西适合另一个东西。

  • 在软件开发中,系统的数据和行为都正确,但是接口不符合时,可用使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用与希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。

  • 对象适配器模式——适用于支持单继承(只能有一个父类)的语言

什么时候使用适配器模式?

  • 使用一个存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑使用适配器模式。

  • 两个类所做的事情相同或者相似,但是具有不同的接口时要使用适配器模式。

什么时候都要使用适配器模式嘛?

不对!!!

如果能事先预防接口不同的问题,不匹配问题就不会发生,在小的接口不统一问题发生时,及时重构,问题不至于扩大;只有碰到无法改变原有设计和代码的情况时,才考虑适配。

事后控制不如事中控制,事中控制不如事前控制。

适配器模式相当于事后控制的一种方式,如果无视它的应用场合盲目使用,反而是本末倒置。

在阅读适配器模式的实现的时候,我就直觉,这个模式不能到处乱用,看着就觉得很奇怪,到底这种模式有啥用、做了啥什么的。

适配器模式优点

将目标类和适配器类解耦,增加了类的复用性和透明性,同时系统的灵活性和扩展性都非常好,更换适配器或者增加新的适配器都非常方便,符合“开闭原则”。

适配器模式实例——耳机、充电一孔多用途

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//适配者类
public class AirPlus {
public void listen() {
System.out.print("听.....");
}
}

//目标抽象类
public interface Ipad {
public void chongdian();//平板只有充电器接口
}

//适配器类
public class IpadAdapter extends AirPlus implements Ipad{
public void chongdian() {
System.out.print("使用平板");
super.listen();//调用耳机的听的方法,相当于不同插头的转接
}
}

//客户端调用
public class Client {
public static void main(String[] args) {
AirPlus airplus=new AirPlus();
Ipad i=new IpadAdapter();
i.chongdian();
}
}

缺省适配器模式

缺省适配器模式是适配器模式的一种变形,但其使用也非常广泛。

缺省适配器模式(Default Adapter Pattern)定义:当不需要全部实现接口提供的方法时,可先设计一个抽象类实现该接口,并为接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可以有选择的覆盖父类的某些方法来实现需求。

适用于一个接口不想使用其所有方法的情况,因此也称为单接口适配器模式。