适配器模式
适配器模式(Adapter Pattern)是一种结构型设计模式,其主要目的是将一个接口转换为客户端期望的另一个接口,使得原本不兼容的接口可以协同工作。适配器模式通常用于解决现有类的接口与需求接口不一致的问题,无需修改原有接口,通过适配器来达到复用的目的。适配器模式分为两种类型:对象适配器模式和类适配器模式。
类图
主要角色
- 目标(Target):这是客户所期待的接口,也就是适配器转换后的接口。客户通过这个接口与适配器交互,而不需要知道具体的实现细节。
- 适配者(Adaptee):适配者即需要被适配的 类或接口,拥有特定的接口,但是不符合客户端的需要。
- 适配器(Adapter):适配器是本模式的核心,它将适配者的接口转换为客户期望的目标接口。适配器可以是类结构,也可以是对象结构。
类适配器模式
在类适配器模式中,适配器继承自适配者类,并实现目标接口。这种方式利用多态性来达到适配的效果,但要求适配者必须是一个类,且Java等单继承语言中,这限制了适配器的进一步扩展,因为它不能再继承其他类。
对象适配器模式
对象适配器模式采用对象组合的方式,适配器包含一个适配者对象的引用,通过委托调用适配者的功能。这种方式更加灵活,因为适配器类可以同时使用多个不同的适配者类,而且可以在运行时动态改变行为。
适用场景
- 当你想要使用一个已经存在的类,而它的接口不符合你的需求时。
- 你想创建一个可复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
- 你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它们的父类接口。
- 双方不都太容易修改的时候在使用适配器模式适配
优缺点
优点:
- 提高了系统的灵活性和可扩展性。
- 使得原本不兼容的接口可以协同工作,增加了类的复用。
- 符合开闭原则,可以在不修改原有系统的基础上增加新的行为。
缺点:
- 过多使用适配器,会让系统代码结构复杂化,增加理解难度。
- 使用对象适配器模式时,可能会增加额外的开销,因为适配器需要持有被适配者的引用。
示例
java
interface Target {
void request();
}
class Adaptee {
public void specificRequest() {
System.out.println("Adaptee's specific request.");
}
}
class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
public class AdapterDemo {
public static void main(String[] args) {
Target target = new Adapter(new Adaptee());
target.request();
}
}