适配器模式

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

主要优点:

  1. 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构。

  2. 增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用。

  3. 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。

对象适配器模式

对象适配器是通过组合来实现适配器功能的,源对象成为了适配器的构造器函数的参数

UML类图如下所示

适配器模式中一共有3个角色,分别是:源角色PowerAdaptee 、目标角色PowerTarget、适配器角色PowerAdapter。

在代码示例中,源角色被作为初始化参数传入PowerAdapter,而PowerAdapter实现了PowerTarget接口,使得源角色能够适配目标角色

public class PowerAdapter implements PowerTarget{
	private PowerAdaptee powerAdaptee;

	public PowerAdapter(PowerAdaptee powerAdaptee) {
		super();
		this.powerAdaptee = powerAdaptee;
	}

	@Override
	public int output5V() {
		int output = powerAdaptee.output220V();
		System.out.println("电源适配器开始工作,此时输出电压是:" + output);
		output = output/44;
		System.out.println("电源适配器工作完成,此时输出电压是:" + output);
		return output;
	}
	
}

JDK中对象适配器模式的举例:

由于Thread构造函数不接受Callable参数,想要通过Callable实现一个线程就必须借助一个适配器来实现,而Jdk中已经提供了对应的适配器:FutureTask

FutureTask实现了Runable接口,同时可以在构造器中传入Callable接口的实现类,完成了Callable到Runable的适配

FutureTask构造函数如下:

类适配器模式

此处一个明显的区别是,适配器通过继承的方式,适配源对象,而对象适配器模式通过传参的方式适配对象

public class PowerAdapter extends PowerAdaptee implements PowerTarget{
	
	@Override
	public int output5V() {
		int output = output220V();
		System.out.println("电源适配器开始工作,此时输出电压是:" + output);
		output = output/44;
		System.out.println("电源适配器工作完成,此时输出电压是:" + output);
		return output;
	}
	
}

两种模式的对比

类适配器模式:由于适配器adapter类是适配者adaptee类的子类,因此可以在适配器类中置换一些适配者的方法,即Override(重写),使得适配器的灵活性更强。

对象适配器模式:一个对象适配器可以通过重载多个构造方法把多个不同的适配者adaptee适配到一个目标,也就是说,同一个适配器可以将适配者类和它的子类都适配到目标接口。

 posted on 2020-10-26 16:42  春秋流千事  阅读(103)  评论(0)    收藏  举报