Luckylau's Blog

设计模式之适配器模式

​ 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

​ “适配器”这个词我们平时倒是不少见,比如“电源适配器”,将220V的点转换为电子设备可以接收的小电压的电,可见变压器就是一种“适配器”。不难想到,读卡器是作为内存卡和笔记本之间的适配器,您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。还有我们平时用到的转接头,也是适配器,一端是VGA接口的信号,另一端就可以转换成HDMI的信号。

​ 有时候,这种设计模式也被称为包装(Wrapper)模式。我们平时经常会写或遇到wrapper类,就是同样的作用。下面以耳机适配器为例子;

IPhone7要听歌除了无线必需要必须用lightning

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public interface Lightning {
void listenMusic();
}
public class IPhone7 {
//iphone7有lightning口,没有听歌用的圆孔
public Lightning lightning;
public void setLightning(Lightning lightning)
{
this.lightning=lightning;
}
//听歌只能用lightning口
public void listenMusic()
{
lightning.listenMusic();
}
}

我现在有圆孔耳机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//耳机圆孔
public interface Circle {
void listenMusic();
}
//耳机插入到圆孔就能听歌
public class Earphone implements Circle{
@Override
public void listenMusic() {
// TODO 自动生成的方法存根
System.out.println("肥宅用圆孔耳机听歌");
}
}

于是我购买了一个适配器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//适配器实现了lightning口,可以插入到lightning口
public class Adapter implements Lightning{
//同时有耳机圆孔
public Circle circle;
public Adapter(Circle circle)
{
this.circle=circle;
}
@Override
public void listenMusic() {
// TODO 自动生成的方法存根
circle.listenMusic();
}
}

最后我可以听歌了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class FeiZhai {
public static void main(String[] args) {
//买了一个一台iphone7
IPhone7 iphone=new IPhone7();
//有一个插入到圆孔就可以听歌的旧耳机
Circle circle=new Earphone();
//买一个适配器,适配器上插上耳机
Adapter adpter=new Adapter(circle);
//在lightning口上插上买的适配器
iphone.setLightning(adpter);
//通过适配器实现了用lightning口听歌
iphone.listenMusic();
}
}
Luckylau wechat
如果对您有价值,看官可以打赏的!