适配器模式
定义:将一个类的接口转换成客户期望的另一个接口,使原本就扣不兼容的类可以一起工作
类型:结构型
适用场景:已经存在的类,它的方法和需求不匹配时(方法结果相同或相似)
不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案。
优点:
(1)能提高类的透明性和复用,现有的类复用但不需要改变
(2)目标类和适配类解耦,提高程序扩展性
(3)符合开闭原则
缺点:
(1)适配器编写过程需要全面考虑,可能会增加系统的复杂性
(2)增加系统代码可读的难度
适配器扩展:
对象适配器:通过组合的方式
类适配器:通过继承的方式
Demo
特点:
被适配者写成类,目标写成接口,适配器类包含被适配者变量,实现目标接口
对象适配器
被适配者写成类
public class Adaptee {
public void adapteeRequest() {
System.out.print("被适配者的方法");
}
}
目标写成接口
public interface Target {
void request();
}
适配器类包含被适配者变量,实现目标接口
/**
* Adapter 继承了 被适配者 同时实现了 目标接口
*/
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.adapteeRequest();
}
}
适配器具体实现类
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.print("ConcreteTarget适配方法");
}
}
测试代码
public class Test {
public static void main(String[] args) {
//适配器模式__ 类适配器
Target target=new ConcreteTarget();//COncreteTarget 用于衬托Adapter
target.request();
Target adapter=new Adapter();
adapter.request();
}
}
类适配器
Adaptee 、Target 、ConcreteTarget类同上
Adapter类不进行继承,而是包含被适配类对象,实现target接口,
public class Adapter implements Target {
private Adaptee adaptee=new Adaptee();
@Override
public void request() {
adaptee.adapteeRequest();
}
}
测试代码
public class Test {
public static void main(String[] args) {
//适配器模式__ 类适配器
Target target = new ConcreteTarget();//COncreteTarget 用于衬托Adapter
target.request();
Target adapter = new Adapter();
adapter.request();
}
}