设计模式-适配器模式

适配器模式(Adapter pattern),又叫变压器模式,是将一个类的接口变换成客户端所期待的另一种接口,从而使原本因不匹配而无法一起工作的两个类一起工作。适配器模式有类适配器模式和对象适配器模式两种方式。

适配器模式主要包含以下角色:

    目标角色(Target):客户端所期待的角色,通常为抽象类或接口。

    源角色(Adaptee): 需要被适配的接口,可以是具体的类、也可以是抽象类或接口。

    适配器角色(Adapter):适配器,把源接口转化为目标接口。

下面举一个生活中的例子,以便更好地理解适配器模式。我们生活用电是220V,某小电器的额定电压为22V,此时需要一个变压器。其中:

    Target:用户期待22V电源;

    Adaptee:当前能提供的220V电源;

    Adapter:变压器。


先看类适配器适配器角色Adapter扩展了Adaptee,同时又实现了目标(Target)接口。

设计模式-适配器模式

源代码

Target.java (客户端期待的,提供22V电源)

public interface Target {
	
    public int get22V();

}

Adaptee.java (提供220V电源)

public class Adaptee {
	
	public int get220V() {
		System.out.println("Adaptee-提供了220V的电源");
		return 220;
	}

}

Adapter.java (变压器,将220V转换为22V) 

public class Adapter extends Adaptee implements Target {

	@Override
	public int get22V() {
		int resource = get220V();
		System.out.println("Adapter-将220V转化为22V");
		int target = resource / 10;
		System.out.println("Adapter-得到22V电源");
		return target;
	}

}

Client.java (客户端)

public class Client {
	
	public static void main(String[] args) {
		Target target = new Adapter();
		int value = target.get22V();
		System.out.println("Client-使用的电源是:" + value + "V");
	}

}

执行结果:

Adaptee-提供了220V的电源
Adapter-将220V转化为22V
Adapter-得到22V电源
Client-使用的电源是:22V


再看对象适配器:对象适配器与类适配器的区别是,adapter不去继承adaptee,而是使用委派关系,依赖adaptee。

设计模式-适配器模式

源代码:

Target.java

public interface Target {
	
	public int get22V();

}

Adaptee.java

public class Adaptee {
	
	public int get220V() {
		System.out.println("Adaptee-提供了220V的电源");
		return 220;
	}

}

Adapter.java

public class Adapter implements Target {
	private Adaptee adaptee;

	public Adapter(Adaptee adaptee) {
		this.adaptee = adaptee;
	}
	@Override
	public int get22V() {
		int resource = adaptee.get220V();
		System.out.println("Adapter-将220V转化为22V");
		int target = resource / 10;
		System.out.println("Adapter-得到22V电源");
		return target;
	}

}

Client.java

public class Client {
	
	public static void main(String[] args) {
		Adaptee adaptee = new Adaptee();
		Target target = new Adapter(adaptee);
		int value = target.get22V();
		System.out.println("Client-使用的电源是:" + value + "V");
	}

}

执行结果:

Adaptee-提供了220V的电源
Adapter-将220V转化为22V
Adapter-得到22V电源
Client-使用的电源是:22V

总结

建议尽量使用对象适配器模式,少用泛化关系,多用聚合、依赖关系,降低耦合度。适配器模式具有很好的复用性(可以利用现有的、不匹配的接口),适配器还具有很好的扩展性(在适配器中增添自己的逻辑)。但是适配器如果使用太多,那将是灾难性的,不如直接重构。

友情提示:

源码下载地址(GitHub):点此下载本文相关源代码

整个工程为Maven工程,对Maven不熟悉的同学可以查看我的另一篇博客Maven入门

你可能感兴趣的:(适配器模式,对象适配器,类适配器)