适配器模式
定义
- 将一个接口转换成客户期望的另一个接口。这里的接口可以指一个接口也可以是一个类,一个方法。
- 使本来接口不兼容的类可以一起工作。
类型
结构型
使用场景
- 已经存在的类,他的方法和需求不匹配时(方法结果相同或相似)
- 适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护不同的产品、不同厂家造成的功能相似接口不同的情况下的解决方案。
优点
- 能提高类的透明性和复用性,现有的类的服用但不需要改变。
- 目标类和适配器类解耦,提高程序的扩展性。
- 符合开闭原则
下面开始看代码,首先我们来实现一下类适配器模式。先写一个待适配的类。
public class Adaptee {
public void adapteeRequest(){
System.out.println("被适配者的方法");
}
}
适配接口
public interface Target {
void request();
}
没有经过适配的接口的实现类
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("concreteTarget目标方法");
}
}
适配器登场,适配器类继承了待适配的类,同时实现了适配接口,所以我们直接使用super调用父类方法即可。
public class Adapter extends Adaptee implements Target{
@Override
public void request() {
//...业务逻辑
super.adapteeRequest();
//...
}
}
测试类
public class ClassadapterTest {
public static void main(String[] args) {
Target target = new ConcreteTarget();
target.request();
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
运行结果
concreteTarget目标方法
被适配者的方法
我们下面实现一下使用对象组合的方式类实现适配模式,一般情况下我们推荐使用对象组合的方式来实现适配器模式。在使用对象组合的方式我们的待适配类的和适配接口以及原来的接口实现类都是一样的唯一需要改变的就是适配类。
public class Adapter implements Target{
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
//...
adaptee.adapteeRequest();
//...
}
}
这里的话使用带适配的类的对象来调用带适配的方法。