设计模式之适配器模式

##应用场景

比如说:
1.我的手机是type-c 接口,但是我的耳机线是圆孔接口,耳机线不能直接插在手机上面用。于是我买了个转换线,然后耳机就可以直接插在手机上用了。
2.电脑分屏想必大家知道。很多时候我们的电脑都无法直接连接拓展屏,然后需要淘宝买一个HDMI转Vaga的转接器,然后才能连接。
3.生活中的USB与ps/2键盘的转接,以及插座盒插头也是一样的道理

适配器模式就是让原来接口不兼容,因为接口不匹配不能一起工作的类可以一起工作。

设计模式之适配器模式

##三大角色

1.Target(目标抽象类):目标抽象类定义客户所需要的接口 ,可以是接口
案例中的耳机线,屏幕,USB接口
2.Adapter(适配器类):通过包装一个适配的对象,把原接口转换成目标接口,对Adaptee和Target进行适配
案例中的手机与电脑转接线,转接的插头
3.Adaptee(适配者类):它定义了一个已存在的接口,这个接口需要适配,它包装好了客户需要的业务方法。
案例中手机,电脑,ps/2键盘

##类适配器(使用继承的方式)

定义Adaptee

/**
 * 适配者类
 * (相当于例子中的,手机,电脑,ps/2键盘)
 * @author admin
 *
 */
public class Adaptee {
	public void request(){
		System.out.println("可以完成客户请求需要的功能");
	}
}

定义接口Target

public interface Target {
	void handleReq();//处理请求
}

定义实现类

/**
 * 适配器类(类适配器方式)
 * (相当于手机与电脑转接线,转接的插头)
 * @author admin
 *
 */
public class Adapter extends Adaptee implements Target {

	public void handleReq() {
		super.request();
	}
	
}

测试一

/**
 * 客户端
 * (相当于例子中的手机,只有Type-C接口)
 * @author admin
 *
 */
public class Client {
	public void test1(Target t){
		t.handleReq();
	}
	public static void main(String[] args) {
		Client  c=new Client();//耳机线
		Adaptee a=new Adaptee();//手机
		Target t=new Adapter();//转接线
		c.test1(t);
	}
}

测试一结果
设计模式之适配器模式
因为这边是extends继承某个类过来,所以称之为类适配器。但是弊端很明显,因为在java中,只支持单继承,这种方法不灵活

##对象适配器(使用组合的方式)

/**
 * 适配器(类适配器方式,使用了组合的方式跟适配对象整合) 
 * (相当于手机与电脑转接线,转接的插头)
 * 
 * @author admin
 *
 */
public class Adapter2 extends Adaptee implements Target {
	private Adaptee adaptee;//创建属性

	public void handleReq() {
		adaptee.request();
	}

	public Adapter2(Adaptee adaptee) {//将属性作为参数传入
		super();
		this.adaptee = adaptee;
	}

}

测试二

/**
 * 客户端
 * (相当于例子中的手机,只有Type-C接口)
 * @author admin
 *
 */
public class Client2 {
	public void test1(Target t){
		t.handleReq();
	}
	public static void main(String[] args) {
		Client2  c=new Client2();
		Adaptee a=new Adaptee();
		Target t=new Adapter2(a);//传入被适配的对象
		c.test1(t);
	}
}

测试二结果:
设计模式之适配器模式

我们学习中见过的场景(字符流 转字节流)
java.io.InputStreamReader(InputStream)
java.io.OutputStreamWrite(OutputStream)

##适配器模式的优势

1.解耦:将目标类和适配者类解耦,通过适配器类的引入来重用适配者类
2.复用性:一个适配者类可以在多个不同的系统中复用
3.灵活性与扩展性很强:使用配置文件可以方便的更换适配器,能够在不改动源代码基础上,添加新的适配器符合开闭原则

##小结

在本文中,提到了如下几点:
1适配器模式的应用场景
2适配器模式的三大角色
3.类适配器(使用继承的方式)与对象适配器(使用组合的方式)
4.适配器模式的优势
每学完一个设计模式,都感觉很神奇,刷新了很多自己的认知,后续也会慢慢的结合自己在项目上的实践来完善这些设计模式。