手机用户请
横屏
获取最佳阅读体验,REFERENCES
中是本文参考的链接,如需要链接和更多资源,可以关注其他博客发布地址。
平台 | 地址 |
---|---|
CSDN | https://blog.csdn.net/sinat_28690417 |
简书 | https://www.jianshu.com/u/3032cc862300 |
个人博客 | https://yiyuery.github.io/NoteBooks/ |
适配器模式: 将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
适配器有两种,一种是类适配器,另一种是对象适配器。
利用组合的方式将请求传送给被适配器
UML
顾名思义, ProductV2API
是新的API接口, ProductV1API
为历史API接口,实现类 HisAPIAdaptee
为历史API的实现类,即被适配者。
代码
历史接口 & 实现
public interface ProductV1API {
/**
* V1 版本产品接口
*/
void specificRequest();
}
public class HisAPIAdaptee implements ProductV1API {
/**
* V1 版本产品接口
*/
@Override
public void specificRequest() {
System.out.println("Adaptee specificRequest");
}
}
适配器实现新的接口,并传入历史接口的实现类(被适配者)
public class APIAdapter implements ProductV2API {
private HisAPIAdaptee adaptee;
public APIAdapter(HisAPIAdaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
客户端调用
//客户端程序
public class Client {
public static void main(String[] args) {
//老接口使用
HisAPIAdaptee hisAPIAdaptee = new HisAPIAdaptee();
hisAPIAdaptee.specificRequest();
//适配后新接口对外暴露使用
new APIAdapter(hisAPIAdaptee).request();
}
}
利用多重继承实现,请求传送给被被适配者
APIAdapter 继承 ProductV1API
和 ProductV2API
的实现类,在适配器内部实现请求方法的转发。
但是Java中不允许这样做!
各自特点
相似点
外观模式:提供一个统一的接口,用来访问子系统的一群接口,外观定义了一个高层接口,让子系统更容易使用
UML
//定义外观行为
public interface Facade {
/**
* 开启
*/
void on();
/**
* 关闭
*/
void off();
}
//实现外观行为并针对每个子系统进行统一的外观包装
//灯光控制
public class LightAPI implements Facade {
/**
* 开启
*/
@Override
public void on() {
System.out.println("Light turned on!");
}
/**
* 关闭
*/
@Override
public void off() {
System.out.println("Light turned off!");
}
}
//TV控制
public class TVAPI implements Facade {
/**
* 开启
*/
@Override
public void on() {
System.out.println("TV turned on!");
}
/**
* 关闭
*/
@Override
public void off() {
System.out.println("TV turned off!");
}
}
//全局外观控制
public class FacadeImpl implements Facade {
LightAPI light = new LightAPI();
TVAPI tv = new TVAPI();
/**
* 开启
*/
@Override
public void on() {
light.on();
tv.on();
}
/**
* 关闭
*/
@Override
public void off() {
light.off();
tv.off();
}
}
外观行为的接口定义可以换成其他具体类,非必要实现,外观模式的重点的是封装一批接口,对外提供一个高层接口。
设计原则:
适配器模式
外观模式:
装饰者模式: