适配器模式是把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。


适配器模式应用场景:

用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极、阴极外,还有一个地极。而有些地方的电源插座却只有两极,没有地极。电源插座与笔记本电脑的电源插头不匹配使得笔记本电脑无法使用。这时候一个三相到两相的转换器(适配器)就能解决此问题,而这正像是本模式所做的事情。


适配器模式中所涉及的角色如下:

1)目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

2)需要适配的类(Adaptee):需要适配的类或适配者类。

3)适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。



适配器模式分为两种不同的形式:

1、类的适配器模式

实现特殊功能类,代码如下:

package com.yoodb;

public class Adaptee {
	public void specificRequest() {
		System.out.println("具有特殊功能...");
	}
}


标准接口,代码如下:

package com.yoodb;

public interface Target {
	//标准接口
	public void request();
}


普通功能实现类,代码如下:

package com.yoodb;

public class ConcreteTarget implements Target {
	//具有普通功能
	@Override
	public void request() {
		// TODO Auto-generated method stub
		System.out.println("具有普通功能...");
	}
}


适配器类,代码如下:

package com.yoodb;

public class Adapter extends Adaptee implements Target{
	@Override
	public void request() {
		// TODO Auto-generated method stub
		super.specificRequest();
	}
	
}


测试函数,具体代码如下:

package com.yoodb;

public class ClientMain {

	//测试函数
	public static void main(String[] args) {
		//普通功能
		Target target = new ConcreteTarget();
		target.request(); 
		//特殊功能
		Target adapter = new Adapter();
		adapter.request();
	}

}

测试结果如下:

具有普通功能...
具有特殊功能...


2)对象的适配器模式

在上述类的适配器模式修改适配类,直接实现标准接口,具体代码如下:

package com.yoodb;

public class Adapter implements Target{
	
	private Adaptee adaptee;
	
	@Override
	public void request() {
		// TODO Auto-generated method stub
		this.adaptee.specificRequest();
	}

	public Adapter(Adaptee adaptee) {
		super();
		this.adaptee = adaptee;
	}
	
}


测试函数,具体代码如下:

package com.yoodb;

public class ClientMain {

	//测试函数
	public static void main(String[] args) {
		//普通功能
		Target target = new ConcreteTarget();
		target.request(); 
		//特殊功能
		Target adapter = new Adapter(new Adaptee());
		adapter.request();
	}

}

测试结果如下:

具有普通功能...
具有特殊功能...


适配器模式的优点:

1)更好的复用性

系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。

2)更好的扩展性

在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。


适配器模式的缺点:

过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接

评论

分享:

支付宝

微信