设计模式-适配器模式

310 阅读2分钟

适配器的定义

适配器模式(Adapter Design Pattern)顾名思义,这个模式是用来做适配的,它可以将不兼容的接口转换为可以兼容的接口,让原本由于接口不兼容而不能在一起工作的类可以一起工作。

适配器模式有两种实现方式:类适配器和对象适配器,其中类对象适配器使用的是继承关系来实现的,对象适配器使用组合关系来实现。

适配器的应用

封装有缺陷的接口设计

假设我们依赖的外部系统在接口设计方面有缺陷(比如包含大量静态方法),引入之后会影响到我们自身代码的可测试性,为了隔离设计上的缺陷,我们希望对外部系统提供的接口进行二次封装,抽象出更好的接口设计

统计多个类的接口设计

替换依赖的外部系统

兼容老版本接口

适配不同格式的数据

适配器模式角色

  • Target目标角色

    该角色定义把其他类转换为何种接口,也就是我们期望的接口,例子中IUserInfo接口就是目标角色

  • Adaptee源角色

    你想把谁转换成目标角色,谁就是源角色,它是已经存在的,运行良好的类,经过适配器的包装,他会变成一个崭新的角色

  • Adapter适配器角色

    适配器模式的核心角色,其他两个都是已经存在的角色,而适配器角色是需要新设计的,他的职责很简单,把源角色转换成目标角色,通过继承或者类关联的方式

实例

// 类适配器: 基于继承
public interface ITarget {
	void f1();
	void f2();
	void fc();
}
public class Adaptee {
	public void fa() { //... }
	public void fb() { //... }
	public void fc() { //... }
}
public class Adaptor extends Adaptee implements ITarget {
	public void f1() {
		super.fa();
	}
	public void f2() {
		//...重新实现f2()...
	}
	// 这里fc()不需要实现,直接继承自Adaptee,这是跟对象适配器最大的不同点
}
// 对象适配器:基于组合
public interface ITarget {
	void f1();
	void f2();
	void fc();
}
public class Adaptee {
	public void fa() { //... }
	public void fb() { //... }
	public void fc() { //... }
	}
public class Adaptor implements ITarget {
	private Adaptee adaptee;
	public Adaptor(Adaptee adaptee) {
		this.adaptee = adaptee;
	}
	public void f1() {
		adaptee.fa(); //委托给Adaptee
	}
	public void f2() {//...重新实现f2()...}
	public void fc() {adaptee.fc();}
}