适配器模式
适配器模式可以把一个类的接口变换成客户端所期待的另一种接口,使得原本因接口不匹配而无法在一起工作的两个类可以一起工作。
主要优点:
- 
将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构。 
- 
增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用。 
- 
灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。 
对象适配器模式
对象适配器是通过组合来实现适配器功能的,源对象成为了适配器的构造器函数的参数
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
 posted on 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号