设计模式之适配器模式

个人理解:当客户需要某个功能时,第三方类已存在具体实现,我们只需要把该实现融合到我们提供给客户的接口中即可,而这一融合的方式就是适配器模式啦。

官方描述:把原有接口改造为客户端需要的接口,使不能兼容使用的两个类能一起工作


 适配器模式可分为类适配器和对象适配器两种模式,

·对象适配器模式 - 在这种适配器模式中,适配器容纳一个它我包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。

·类适配器模式 - 这种适配器模式下,适配器继承自已实现的类(一般多重继承)。


 ----- 类适配器模式----

这个图有误,应该是继承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();
	}

}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值