适配器模式

定义

适配器模式从名字与其结构上可以看出,其体现出的是一个转化作用。将已有的功能转化为客户端所期待的功能,也可以理解为,将客户端实际使用的接口在暗中转接到一个已存在的类上,该移花接木操作对客户端而言是透明的。

结构

从定义中可以看出,该模式需要包含三个部分:

1、目标接口,在其中定义了客户端所需要的功能接口,也就是待实现的方法

2、适配者类,提供目标接口中实际使用到的方法

3、适配器类,在目标接口与适配者之间,起到转化作用,使得在适配器中,调整后的适配者方法可以满足目标接口的需求

适配器模式有两种结构:

对象适配器


由图可知,适配器实现了Target目标接口,同时包含对适配者的引用,实现目标接口方法内部实际是对适配者方法的修改或者直接使用,该方式称之为对象适配器模式(图中将目标Target画为接口形式,实际上接口、抽象类、具体类都可以)。

在对象适配器模式中,通过引用多个适配者对象,可以满足多个转化功能,可以提高复用性,或者可以完成多个适配者对一个功能的组合适配,如下图。

将多个适配者适配到同一个目标接口上


如下则是将同一个适配器同时提供多种转化功能


该方式虽然可以提供适配器的复用,但是从单一职责方面考虑其实不推荐,包揽的活越多越不利于扩展和修改。

类适配器


该模式下,适配器实现目标接口,同时继承适配者类,在实现目标方法内部实际执行的是适配者的方法。

不过因为不同语言对多继承的限制,该模式或许不能同时继承多个适配者类,并且目标类只能为接口,虽然该模式不能继承多个适配者,但是可以提供对适配者类的方法的重写。

简单结构

public class t{
	public static void main(String[] args){
		Target tar=new Adapter();
		tar.Target_method();
	}
}
interface Target{//目标接口
	void Target_method();
}
class Adaptee{//原有的功能类
	void Adaptee_method(){
		System.out.println("已有的功能。。。");
	}
}
class Adapter extends Adaptee implements Target{//适配器转化类
	public void Target_method(){
		System.out.println("目标功能。。。");
		System.out.println("实际使用的功能。。。");
		Adaptee_method();
	}
}

适配器的结构

适配器也可以有自己不同的实现形式,当目标类中存在多个方法时,只需要利用适配器来完成其中的一个功能,则对于其他的方法,在适配器类中都需要赋予空实现,这种实现形式较为不方便,所以提出了一种称为缺省适配器的形式来解决该问题(如果设计合理的话,其实在上游就应该保证,适配器需要实现的目标接口只需要完成单一功能)。


在该适配器实现形式下,可以满足具体的适配器只需要实现指定的功能即可,简化了类的设计。

总结

适配器模式提供转化作用,复用已有的适配者类方法,并通过适配器类的转换,提供满足客户端需求的功能。具体有两种使用类型:对象适配器模式和类适配器模式。

对象适配器模式虽然可以同时包含对多个适配者的引用,但是不能重写适配者的方法,只能做略微的补充(其实因为包含了对适配者类的引用,所以可以提供一个适配者类的子类,在子类中重写方法并把实例对象赋予给适配器中的对适配者的引用变量上,不过这里适配者类不能为final类型);

类适配器模式则提供了简单的适配者方法重写功能,但是受到多继承的限制。综合来讲,如果在一个对象适配器和类适配器两种模式都可以使用的场景中,出于较低耦合性考虑,偏向于使用对象适配器模式(关联关系相对于继承关系具有更低的耦合性)。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值