本篇文章来讲讲适配器模式,你可能分不清适配器模式和装饰器模式到底有啥区别,读完本文你将有所收获。
原创声明:未经授权,不得转载。授权转载请在文章开头声明原文作者和原文链接。
我们生活中的适配器
在我们的生活工作中,适配器对你一定不陌生。例如,你的手机充电器,将220V的高压电适配成手机正常使用的5V电压。你在欧洲国家使用美国制造的笔记本电脑,需要一个将美式插头转换成欧式插头的转换器。
面向对象中的适配器
例如你有一个软件系统,对外提供接口服务。由于架构重构,接口升级导致现在的调用方无法正常调用和兼容了。但你又不想修改旧代码,因为里面的坑实在太多,改一下很容易产生新的BUG。于是,你就想到可以做一个中间的适配服务,能正常接收原调用端的请求,然后将请求适配到旧接口服务上,并将结果返回。
这就是适配器模式最重要的用途。
适配器模式的定义
适配器模式将一个类的接口,转换为客户端期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
适配器模式的UML类图
适配器模式UML类图角色划分
(1)客户端:用来调用目标接口。
(2)Target:目标接口,对外定义适配的目标接口。
(3)Adapter:适配器类,用来实现目标接口,并通过组合的方式,调用被适配对象的方法。
(4)Adaptee:被适配者,
适配器示例代码
目标接口
public interface Target {
void request();
}
适配器
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.request();
}
}
被适配者
public class Adaptee {
public void request() {
System.out.println("I'am a old function");
}
}
Client客户端
public class Client {
public static void main(String[] args) {
Target target = new Adapter(new Adaptee());
target.request();
}
}
输出:I'am a old function
适配器模式适用场景
调用双方接口不一致且都不容易修改时,可以使用适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
多个组件功能类似,但接口不统一且可能会经常切换时,可使用适配器模式,使得客户端可以以统一的接口使用它们。
适配器 Or 装饰器
说到两者的区别,我们就来一起看看吧。
(1)装饰器:装饰器的所有类,都继承自同一个父类,属于相同的类。适配器:适配器和被适配者属于两个完全不同的类,它的主要职责是将一个接口转换为另一个完全不同的接口。
(2)装饰器:装饰器主要是给类增加功能和职责,类没有任何变化,不改变接口。
推荐阅读
设计模式(一)策略模式
设计模式(二)观察者模式
设计模式(三)装饰器模式
设计模式(四)简单工厂模式
设计模式(五)工厂方法模式
设计模式(六)抽象工厂模式
设计模式(七)单例模式你用对了吗
网友评论