在这篇文章中,我们接着之前的话题,对常见的设计模式进行简单的了解。

今天要说什么模式呢?答案是:适配器模式!


适配器模式,作为二十几种设计模式中使用比较多的一种设计模式,其思想也是比较容易理解的。对于学Java的人来说,应该知道适配器模式被广泛应用到了JDK的源码中。现在,我们就来看看什么是适配器模式。

适配器模式:把类的接口变换成客户端所期望的另外一种接口。适配器模式的作用就是让原本因为接口不兼容、不匹配而不能在一起工作的双方在经过某种处理后可以在一起工作。


先来看看适配器模式的结构,如下所示:

java 内部类做适配器 java设计模式适配器模式_客户端


这里,我们可以看出,适配器模式主要包含三个角色:

(1)目标角色(Target):客户端Client希望得到的可以使用的接口或者方法;

(2)源角色(Adaptee):原来的老的接口,需要适配的源对象;

(3)适配器角色(Adapter):适配器类,用于将老的源角色经过某种操作转换为客户端希望得到的目标角色;


通过适配器模式,我们就可以复用原来的老的功能,而又不用重新去开发新的一套逻辑去实现原有的功能,只需要简单的创建一个适配器类角色在中间做一次转换。下面我们通过简单的Java代码示例来看看到底是怎么实现的。


目标角色代码示例:

package com.majing.test.designpattern.adapter;

/**
 * 目标角色
 * @author majing
 *
 */
public interface Target {
	/**
	 * 希望使用的新的接口
	 */
	void newRequest();
}



源角色代码示例:

package com.majing.test.designpattern.adapter;

/**
 * 源角色
 * @author majing
 *
 */
public class Adaptee {
	/**
	 * 老的功能实现方法
	 */
	public void oldRequest(){
		System.out.println("通过旧的实现类实现的业务功能");
	}
}



适配器类角色:

package com.majing.test.designpattern.adapter;

/**
 * 适配器角色
 * @author majing
 *
 */
public class Adapter implements Target {
	
	private Adaptee adaptee;
	
	public Adapter(Adaptee adaptee){
		this.adaptee = adaptee;
	}

	@Override
	public void newRequest() {
		System.out.println("调用旧的功能实现前做一些业务处理");
		//新接口底层调用老的功能实现
		adaptee.oldRequest();
		System.out.println("调用旧的功能实现后做一些业务处理");
	}

}



客户端Client角色:

package com.majing.test.designpattern.adapter;

/**
 * 客户端角色
 * @author majing
 *
 */
public class Client {
	public static void main(String[] args) {
		System.out.println("适配器模式演示用例输出:");
		Adaptee adaptee = new Adaptee();
		Target demo = new Adapter(adaptee);
		demo.newRequest();
	}
}



运行上面的main方法,可以得到下面的输出:

java 内部类做适配器 java设计模式适配器模式_客户端_02


从上可以看出,我们在使用新接口的同时,并没有去重新实现原来的功能,而是通过某种变化将原来的不兼容的接口以一种客户端希望的接口形式给提供了出来,保证了客户端和老的功能实现之间的兼容性。


适配器模式具有一定的优点,那就是可以使以前的功能实现得到更好的复用,提高了开发效率,降低了开发成本,但是过多的使用适配器模式,会让整个系统变的非常复杂,不利于整体去把握。因此,在各种成本能够允许的情况下,建议还是对原有的代码进行重构优化解决问题,当然如果你角色适配器模式能够很好的角色你的问题,那也未尝不可,你说呢?


至此,关于适配器模式的相关说明已经全部讲述完毕。