设计模式15:适配器模式及类、对象、接口适配器

129 阅读4分钟

适配器模式及类、对象、接口适配器

1.基本介绍

(1) 基本介绍
  • 适配器模式(Adapter Pattern),又叫包装器模式。将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性。让原本因接口不匹配不能一起工作的两个类可以协同工作。
  • 适配器模式属于结构型模式
    在这里插入图片描述
(2) 分类
  • 类适配器
  • 对象适配器
  • 接口适配器
(3) 工作原理
  • 将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容。
  • 从用户的角度看不到被适配者,是解耦的。
  • 用户调用适配器转化出来的目标接口方法,适配器调用被适配者的相关方法。
  • 用户收到返回结果,感觉只是和目标接口交互。

2.类适配器

(1) 基本介绍

适配器类(Adapter),通过继承被适配者类(Src),实现目标类(Tar)的接口,完成Src类 -> Tar类的适配。

(2) 使用类适配器模式解决电压问题

在这里插入图片描述
在这里插入图片描述

/** 被适配着:插座,输出220V电压 **/
public class Voltage220V{
	public int output220V(){
		sout("输出220V电压");
		return 220;
	}
}

/** 适配接口:提供输出5V的电压方法 **/
public interface IVoltage5V{
	int output5V();
}

/** 适配器类:实现输出5V的电压方法 **/
public class VoltageAdapter extends Voltage220V implements IVoltage5V{
	@Override
	public int output5V(){
		int src = output220V();	// 使用被适配类的方法获取220V
		src = src / 44;	// 降压
		return src;
	}
}

/** 调用者:手机充电,因为不能直接调用输出220V的电压类,所以调用适配器类(接口) **/
public class Iphone{
	public void charging(IVoltage5V iVoltage5V){
		int v = IVoltage5V.output5V();
		sout("充电中...电压:" + v);
	}
}

public class Do{
	psvm(){
		Iphone iphone = new Iphone();
		iphone.charging(new VoltageAdapter());
	}
}
(3) 注意事项
  • Java是单继承机制,所以类适配器需要继承被适配类是一个缺点。
  • 被适配类中的方法会在适配器中暴露出来,增加了使用成本。
  • 由于继承了被适配类,所以适配器可以根据需求重写被适配类的方法,使适配器类更加灵活。

3.对象适配器

(1) 基本介绍
  • 基本思路与类适配器模式相同,只是将适配器类(Adapter)做修改,不再继承被适配类(Src),而是持有被适配类的实例。
  • 持有被适配类的实例,实现目标类的接口,完成Src-> Tar的适配。
  • 根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系。
  • 对象适配器是适配器模式常用的一种
(2) 使用对象适配器模式解决电压问题

在这里插入图片描述

/** 被适配着:插座,输出220V电压 **/
public class Voltage220V{
	public int output220V(){
		sout("输出220V电压");
		return 220;
	}
}

/** 适配接口:提供输出5V的电压方法 **/
public interface IVoltage5V{
	int output5V();
}

/** 适配器类:实现输出5V的电压方法 **/
public class VoltageAdapter implements IVoltage5V{
	private Voltage220V voltage220;

	public void VoltageAdapter(Voltage220V vol){
		voltage220 = vol;
	}

	@Override
	public int output5V(){
		int src = voltage220.output220V();	// 使用被适配类的方法获取220V
		src = src / 44;	// 降压
		return src;
	}
}

/** 调用者:手机充电,因为不能直接调用输出220V的电压类,所以调用适配器类(接口) **/
public class Iphone{
	public void charging(IVoltage5V iVoltage5V){
		int v = IVoltage5V.output5V();
		sout("充电中...电压:" + v);
	}
}

public class Do{
	psvm(){
		VoltageAdapter voltage = new VoltageAdapter(new Voltage220V());
		
		Iphone iphone = new Iphone();
		iphone.charging(voltage);
	}
}
(3) 注意事项
  • 对象适配器和类适配器是同一种思想,只不过实现方式不同。
  • 对象适配器根据合成复用原则,使用组合替代继承。它解决了类适配器必须继承配适配器类的局限性。
  • 使用成本更低、更灵活。

4.接口适配器

(1) 基本介绍