什么是适配器模式
现有接口 iA,iB的情况下,我们希望在不修改已有代码的情况下iA可以使用iB的接口。根据开放封闭原则,我们可以立马想到增加一个类使iA兼有iB接口的功能。这就是适配器接口的由来,其定义可以为:Adapter pattern works as a bridge between two incompatible interfaces.
如何写适配器
适配器是在已有两个不兼容的接口的背景下,以开放封闭原则来编码代码形成的一种规范。
我们举一个场景,其现有代码:
iA
{
doA();
}
iB{
doB();
}
main()
{
iA a = new Aimpl();
a.doA();
}
我们希望在main(){}方法中,a.doA()具有iB.doB()接口的功能。由此我们想到了wrapper 对象把A包装起来。
AdapterToB implement iA //至于AdapterToB需不需要实现iB接口不重要,不是适配器模式所规范的
{
iB b;
public void doA()
{
b.doB();
}
}
//我们只需要添加一个类:AdapterToB 在调用的时候把对象实例替换掉就可以,具体场景中也许A对象实例是通过spring注入的,此时只需要修改配置文件即可。
main()
{
iA a = new AdatperToB();
a.doA();
}
适配器与代理模式区别
谈到代理模式与适配器的区别,我们先简单回顾下代理模式是什么样的。
public ProxyA implement A //运用代理后客户端访问接口不变所以需要继承相同的接口。
{
RealA a;
public void do()
{
//create A if a is not create
//dosomething.....
a.do();
}
}
看了上面简单描述我们知道代理模式描述的是A与proxyA的关系,比如A是一个远程调用我需要代理起来可以额外空盒子。
而适配器模式描述的是解决 iA,iB之间的关系,设计到 iA,iB,AdapterToB三个类之间的关系。
说在后面的话
1.学习东西要带入场景,比如适配器模式是已有iA,iB两个接口的情况下,如何使其兼容。
2.如果只有一个接口iA, 你想替换到iA的接口iA实现类不多或者已有的实现不用了,那么直接在iA实现类上修改即可。
比如:
Aimpl1 implement iA
{
doA()
{
XXXXXX Aimpl1 doA
}
}
3.又比如iA有很多的实现比如Aimp1,Aimpl2,Aimpl3,且代码中大量引用Aimpl1,Aimpl2,Aimpl3对象。
如果你在新的场景下需要iA接口具有新的功能,又不想修改iA接口(很多原因,比如iA是别的团队提供的),那么可以使用适配器模式。
然后在新的场景下使用适配器类。
//新的场景
iA a = new AdatperToB();
a.doA();
网友评论