目录
前言
适配器模式,用于将一个类的接口转换成客户端所期望的另一个接口,以解决由于接口不兼容或不匹配而无法协同工作的问题。
使用适配器模式,新增加了适配类和接口,能够在不修改原来类的接口的前提下,使得原本无法一起工作的类能够一起工作,符合软件设计的开闭原则,同时也提高了代码的复用性,并降低了新旧接口之间的耦合度。
UML
plantuml
@startuml 'https://plantuml.com/class-diagram interface target { + method() : void } class Adaptee { + originalMethod() : void } class Adapter { - adaptee : Adaptee + Adapter(Adaptee) + method() : void } class Client { + {static} main(String[]) : void } target <|.. Adapter Adapter "1" --> "1" Adaptee Client ..> Adaptee Client ..> Adapter @enduml
类图
实战代码
实现适配器模式,有两种实现模式,继承和组合,基于组合替代继承思想,常用组合来实现适配器模式
组合
// 目标接口
interface Target {
void method();
}
// 被适配类
class Adaptee {
void originalMethod() {
System.out.println("originalMethod");
}
}
// 适配器类
class Adapter implements Target {
private Adaptee adaptee;
Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void method() {
adaptee.originalMethod();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target target = new Adapter(adaptee); // 使用适配器,传入被适配类的实例
target.method();
}
}
继承
这里也贴一下继承的实现,作为对比
// 目标接口
interface Target {
void method();
}
// 被适配类
class Adaptee {
void originalMethod() {
System.out.println("originalMethod");
}
}
// 适配器类
class Adapter extends Adaptee implements Target {
@Override
public void method() {
originalMethod();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Target target = new Adapter(); // 使用适配器
target.method();
}
}