将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 --- 《设计模式》GOF
Adapter模式的宗旨就是,基于现有类所提供的服务,向客户端提供接口,以满足客户的期望。---《java设计模式 》
对软件系统中,如果要复用以前的“现存对象”,但是这些对象所提供的接口并不一定能适应我们的新环境,我们就要将其转换成我们需要的接口,来供我们调用。Adapter模式通过定义一个新的接口(对要实现的功能加以抽象),和一个实现该接口的Adapter(适配器)类来透明地调用外部组件。这样替换外部组件时,最多只要修改几个Adapter类就可以了,其他源代码都不会受到影响。
简单理解就是:我们需要实现某个功能,而现在实现这个功能的组件不必我们自己开发,可以通过第三方的组件(即别人的代码或者自己曾经写过的代码)来实现,但第三方组件的接口与现在所定义的接口不一致(即类名,方法名不一样),那么在不修改两方接口的情况下,可以通过采用适配器模式来解决这一问题。
适配器的UML图:
Target 即客户端给出的接口(此处不是java语言中的接口类型,而是指类名,方法名等等),
也就是客户端需要调用的组件。
Adapter 即适配器
Adaptee 即第三方组件
根据Target是否是java接口类型,适配器可以分为类适配器和对象适配器。
类适配器:
此时Target是一个java接口,其中定义了其所期望的功能,而此时的Adapter则通过继承Adaptee类并实现Target接口来完成。即
- class Adapter extends Adaptee implements Target{}
class Adapter extends Adaptee implements Target{}
假设现在Target的内容为:
- interface operation {
-
public int add(int a , int b);
- }
interface operation {
public int add(int a , int b);
}
Adaptee的内容为:
- public class Adaptee{
-
public int addOpe(int a ,int b){
-
return a+b;
- }
- }
public class Adaptee{
public int addOpe(int a ,int b){
return a+b;
}
}
那么为了利用Adaptee类,类适配器Adapter可以写成:
- public class Adapter extends Adaptee implements Target{
-
public int add(int a , int b) {
-
return addOpe(a,b);
- }
- }
public class Adapter extends Adaptee implements Target{
public int add(int a , int b) {
return addOpe(a,b);
}
}
对象适配器:
此时Target可能是一个普通类,那么Adapter的实现可以通过继承Target,并将具体实现委托给Adaptee来完成。同样是前面的add例子:
- class Target{
-
public int add(int a , int b){}
- }
class Target{
public int add(int a , int b){}
}
- Public class Adapter extends Target{
-
- Adaptee adaptee;
-
- Adapter(Adaptee adaptee){
-
this.adaptee = adaptee ;
- }
-
-
public int add(int a,int b){
-
return adaptee.addOpe(a,b);
- }
- }
Public class Adapter extends Target{
Adaptee adaptee;
Adapter(Adaptee adaptee){
this.adaptee = adaptee ;
}
public int add(int a,int b){
return adaptee.addOpe(a,b);
}
}
总结:个人觉得适配器模式用到了面向对象语言中的多态的特性,根据客户端给出的组件是接口还是类,适配器通过实现接口或者继承类的方式来实现多态。 如果是实现接口,那么适配器则可以继承第三方组件,通过调用父类方法来完成功能。如果是继承,因为java中不支持多继承,适配器将具体操作委派给第三方组件来完成。这是根据客户端给出的组件类型来区分,个人认为即使客户端给出的组件是接口,也可以通过将具体实现委派给第三方组件来完成,因为设计模式的原则是:优先使用对象组合而不是类继承。这样适配器模式就很容易理解,就是客户端通过多态调用适配器,适配器通过使用第三方对象来完成具体功能。
小弟初学设计模式,肯定有理解不太清楚的地方,希望各位不吝指教。
分享到:
相关推荐
java设计模式【之】适配器模式【源码】【场景:水和容器】 * 适配器模式,类似(亡羊补牢) * 已经存在的类(功能已经开发完成了),与新需求的功能相似,但是略有差异 * 当已经存在的方法无法满足现有需求,需要...
C#设计模式之适配器模式应用实例
设计模式之适配器模式Java版 设计模式之适配器模式Java版 设计模式之适配器模式Java版 设计模式之适配器模式Java版
[刚刚上传的demo运行有问题,重新传了个新的],这个的一个iOS的适配器模式的实例代码,目前就是一个简单的demo,后期还会更新适配器在 MVC,MVP,MVVM中的使用,demo对应着简书:https://www.jianshu.com/p/e2ebcf19098f,...
实验7 适配器模式、外观模式与模板方法模式---Java设计模式
适配器模式的Java实现版本,包含类适配器模式和对象适配器模式的实现,同时也包含两者的UML类图
动态代理模式 适配器模式 实现,都可以运行,有一部分注解
设计模式之适配器模式,通过实际例子讲述适配器模式的使用,原理和特点
适配器模式代码demo 适配器模式代码demo 适配器模式代码demo
适配器模式 设计模式 Adapter 还请各位大S指教
设计模式-适配器模式(讲解及其实现代码)
设计模式--适配器模式java例子
设计模式C++学习之适配器模式(Adapter)
实验七:适配器模式.rar实验七:适配器模式.rar
设计模式的适配器模式的例子,希望对大家有用
设计模式系列之适配器模式,分别以Java,Android,IOS进行讨论