这次跟大家分享一下我对适配器模式的理解。
适配器模式的定义:
将一个类的接口转换成用户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类,可以一起工作了。
举个我们日常生活中的例子:
有一部移动电源,有一部iphone一部android手机,需要充电使用普通的Usb线就可以给android手机充电,而在给iphone充电的时候必须使用适配iphone的万能转接头才能充电。
iphone和android就相当于两个不兼容的接口,转接头就相当于一个适配器,他使得iphone和android手机都能充电了。
在我们的项目中可以这样是用适配器模式:
假如我们开发一个发发动态的功能,第一版要求可以发送文字,实现如下:
public interface ISendTextPost{
public void sendTextPost();
}
public class SendTextPost implements ISendTextPost{
public void sendTextPost{
//发送文字动态
}
}
实现方式如上所述,很简单。如果第二版要求既可以发图片也可以发文字动态,实现如下:
public interface ISendPicturePost{
public void sendTextPost();
pubiic void sendPicturePost();
}
//假如发文字和图片是这样的~~
public class SendPicturePost implements ISendPicturePost{
public void sendTextPost{
//发送文字动态
}
public void sendPicturePost{
//发送图片动态
}
}
上述这样实现可以吗?答案是必须不行的,因为发送文字的方法之前已经实现了,完全没必要再去实现一次。如果重复的方法有很多呢,估计都想砸键盘了。
对于这种接口不兼容的问题,使用适配器模式可以很好的解决:
适配器模式的模型如下:
// 用户所需功能接口 target1
public interface ITarget1{
public void doTarget1();
}
//target1实现类
public class Target1Impl implements ITarget1{
public void doTarget1(){
//做A事情
}
}
// 用户所需功能接口 target2
public interface ITarget2{
public void doTarget2();
}
//target2实现类
public class Target2Imp implements ITarget2{
public void doTarget2(){
//做B事情
}
}
// 适配器
public class Adapter implements ITarget1, ITarget2{
private ITarget1 target1;
private ITarget2 target2;
public Adapter(ITarget1 target1,ITarget2 target2){
this.target1 = target1;
this.target2 = target2;
}
public void target1(){
//做A事情
target1.doTarget1();
}
public void doTarget2(){
//做B事情
target2.doTarget2();
}
}
// Client
public class Client {
public static void main(Sting[] args){
ITarget1 target1 = new Target1Impl();
ITarget2 target2 = new Target1Imp2();
Adapter adapter = new Adapter(target1,target2);
adapter.doTarget1();
adapter.doTarget2();
}
}
上面就是使用适配器的实现方式。在上述的实现方式中, target1
和 target2
都是业务层面的接口,他们有不同的业务功能,对于客户端来说,调用 target1
接口时很正常,但是要兼容 target2
的功能的时候,就需要有一个实现了 target1
功能,并且兼容了 target2
功能的类, Adapter
就是这样的一个类,他就是一个转换器,兼容不同的接口来实现功能。
在上面的实现中,实质上是使用了 对象组合
来实现业务功能的兼容。使用 Adapter
可使得已有功能复用,加快开发效率,减少维护成本,在 Adapter
中也可以加入一些自己实现的公用方法,这样可以使得Adapter的功能更强大。
但是要注意的一点是,在一个系统中不应该过多的使用 Adapter模式
,使用过多,会使得系统变得比较凌乱,不好把握,本来明明调的是A接口但是返回的是B结果,因此在使用适配器模式时要记住这一点。
适配器模式的最重要的一点就是,对象组合,转换匹配,复用功能。