二十三种设计模式之适配器模式
1. 设计模式的分类
创建型模式(五种):工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。
结构型模式(七种):适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。
行为型模式(十一种):状态模式、模板方法模式、访问者模式、迭代子模式、责任链模式、备忘录模式、解释器模式、命令模式、中介者模式、观察者模式、策略模式。
2. 为什么要引入适配器模式?
在软件开发的海洋中,我们经常会遇到各种不同的系统和组件,它们可能由于设计时的考虑不周或技术演进导致接口不兼容。这时,适配器模式(Adapter Pattern)就成为了我们解决问题的利器。
3. 什么是适配器模式?
适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。适配器让那些接口不兼容的类可以一起工作,从而提高了类的复用性。
最常见的比喻是电源适配器。当你出国旅行时,可能会遇到电源插座与你的电子设备充电器不匹配的情况。这时,你需要一个电源适配器来转换插头的形状和电压,使得你的充电器能够适应当地的电源插座。在这个比喻中:
- 目标接口:是你电子设备的充电器接口。
- 被适配者:是目的地国家的电源插座。
- 适配器:是实际的电源适配器,它连接了两者。
4. 适配器模式的分类
适配器模式主要分为两种类型:
-
类适配器模式:通过多重继承将一个类的接口转换成另一个接口。在不支持多重继承的语言中,通常使用组合的方式来实现。
-
对象适配器模式:通过创建一个包装对象,将请求从一个对象传递到另一个对象。
5. 类适配器模式
5.1 组件
- Target(目标接口):客户端期望的接口。
- Adaptee(被适配者):需要适配的类,其接口与目标接口不兼容。
- Adapter(适配器):继承Adaptee并实现Target接口。
5.2 示例
假设我们有一个旧的系统,它提供了一个Adaptee
类,该类有一个specificRequest
方法。现在,我们需要在新的系统中使用这个类,但新系统的接口是Target
接口,它期望有一个request
方法。
// 目标接口
public interface Target {
void request();
}
// 被适配者
public class Adaptee {
public void specificRequest() {
System.out.println("Specific Request");
}
}
// 适配器
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
specificRequest();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Target target = new Adapter();
target.request();
}
}
在这个例子中,
Adapter
类继承了Adaptee
类并实现了Target
接口,使得原本不兼容的Adaptee
类可以通过Adapter
来满足Target
接口的需求。
6. 对象适配器模式
6.1 组件
- Target(目标接口):客户端期望的接口。
- Adaptee(被适配者):需要适配的类。
- Adapter(适配器):持有Adaptee的引用并实现Target接口。
6.2 示例
对象适配器模式与类适配器模式的主要区别在于,对象适配器模式使用组合而非继承。
// 目标接口
public interface Target {
void request();
}
// 被适配者
public class Adaptee {
public void specificRequest() {
System.out.println("Specific Request");
}
}
// 适配器
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target target = new Adapter(adaptee);
target.request();
}
}
7. 适配器模式的应用场景
适配器模式通常用于以下场景:
- 系统需要使用一些现有的类,而这些类的接口不符合系统的需要。
- 想要建立一个可重复使用的类,用来与一些彼此之间没有太大关系的类一起工作,包括一些可能在将来引进的类。
8. 适配器模式的优点
- 提高类的复用性:通过适配器模式,我们可以重用现有的类,而不需要修改它们的代码。
- 解耦系统组件:适配器模式提供了一个中间层,使得系统组件之间的依赖关系减少,提高了系统的灵活性。
9. 适配器模式的缺点
- 增加系统的复杂性:如果过度使用适配器模式,可能会使得系统结构变得复杂,增加理解和维护的难度。
10. 结论
适配器模式是一种强大的设计模式,它可以帮助我们在不修改原有代码的情况下,实现不同系统或组件之间的协同工作。通过合理地使用适配器模式,我们可以提高软件的复用性和灵活性,但也要注意避免过度使用,以免增加系统的复杂性。