个人理解:当客户需要某个功能时,第三方类已存在具体实现,我们只需要把该实现融合到我们提供给客户的接口中即可,而这一融合的方式就是适配器模式啦。
官方描述:把原有接口改造为客户端需要的接口,使不能兼容使用的两个类能一起工作
适配器模式可分为类适配器和对象适配器两种模式,
·对象适配器模式 - 在这种适配器模式中,适配器容纳一个它我包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。
·类适配器模式 - 这种适配器模式下,适配器继承自已实现的类(一般多重继承)。
----- 类适配器模式----
这个图有误,应该是继承Adaptee,实现Target,可惜家里没有visio,改天再画咯
这种适配器模式下,适配器继承自已实现的类(一般多重继承)实现被适配者接口。
----- 对象适配器模式----
-- 在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。
对象的适配器模式的效果:
1.一个适配器可以把多种不同的源适配到同一个目标,换言之,同一个适配器可以把源类和它的子类都适配到目标接口。
2.与类的适配器模式相比,要想置换源类的方法不容易。(如果面向接口编程就方便了,通过set不同的源类即可解决这个问题)
3.虽然想置换源类的方法不容易,但是添加新方法容易,且适用于所有的源。
总结:类适配器通过继承来获取适配类(原)的功能的,对象适配器而是通过适配类的对象来获取的,这就解决了java不能多继承所带来的不便了。这也是java提倡的编程思想之一,即尽量使用聚合不要使用继承。 项目中还是推荐使用对象适配器。
最后附上自己的实例:
业务场景一:业务方要求我们提供个获取客户相关信息的功能,给开发方定义了接口ClassTarget如下
package adapter;
/**
* 该接口要求实现获取客户信息的接口
* @author Administrator
*
*/
public interface ClassTarget {
String getCustomer();
}
开发方发现之前该功能接口已存在具体实现了
package adapter;
public class Customer {
public String getCustomer(){
return "customer";
}
}
那我们可以通过通过继承把已有实现融合进现有接口实现中,从而避免了重复开发工作,这就是类适配器模式
package adapter;
/**
* 类适配器
* 定义一个接口,要求能获取客户信息
* @author Administrator
*
*/
public class ClassAdapter extends Customer implements ClassTarget {
public String getCustomer() {
// TODO Auto-generated method stub
return super.getCustomer();
}
}
业务场景二:业务方胃口大了,除了客户的基本信息, 他还想要客户的机构信息和卡片信息, 给开发方定义了下述接口
package adapter;
/**
* 该接口要求提供获取客户信息、机构信息、卡片信息的功能
* @author Administrator
*
*/
public interface ObjectTarget {
String getCustomer();
String getOrg();
String getCard();
}
开发方发现这三个功能接口都有具体实现,但问题是这三个实现并不在同一个类中,再用继承的方式搞不定这个问题(java不允许多重继承)
package adapter;
public class Card {
public String getCard(){
return "card";
}
}
package adapter;
public class Org {
public String getOrg(){
return "org";
}
}
package adapter;
public class Customer {
public String getCustomer(){
return "customer";
}
}
这个时候就是对象适配器模式发挥的时候了,我们可以通过包裹类的实例来调用具体的api实现对应的业务功能
package adapter;
/**
* 对象适配器
* 通过获取各个对象的物理实体,然后调用具体api实现接口功能
* 提供获取客户信息、机构信息、卡片信息的功能
* @author Administrator
*
*/
public class ObjectAdapter implements ObjectTarget{
private Customer customer;
private Card card;
private Org org;
public void setCustomer(Customer customer) {
this.customer = customer;
}
public void setCard(Card card) {
this.card = card;
}
public void setOrg(Org org) {
this.org = org;
}
public String getCard() {
// TODO Auto-generated method stub
return card.getCard();
}
public String getCustomer() {
// TODO Auto-generated method stub
return customer.getCustomer();
}
public String getOrg() {
// TODO Auto-generated method stub
return org.getOrg();
}
}