本篇首发于牧码人博客转载请加上此标示。
序言
今天继续设计模式的学习,本章讲的是适配器模式。看这篇文章前希望大家带着这几个问题去看。
- 什么是适配器模式?
- 在什么场景下使用适配器模式?
什么是适配器模式
- 适配器主要来解决什么问题呢?
简单的说就是在程序中已经存在于某个接口,但是又不能直接去使用它的情况。
- 什么是适配?
举个例子,在日常生活中使用最多的一个东西,电脑。大家都知道电脑是不能直接使用220V的电压的。但是中国的电路的电压都是220V,在日本是110v。那么这种情况咋办。电脑不可能设计成一个国家一个电压,每个国家的电压也不会因为某个电子产品去改变。总不能因为你电压要用36v国家就改成36v的常用电压吧。所以这种情况就需要使用到适配器了,这个适配器就是电源适配器,不管在哪个国家他总能把电压转成电脑适合的电压。这个就是适配的概念。把一个不适合的东西变成一个适合的东西。
- 适配器模式
在程序中这个模式也是会用到的,在不能直接去改变源码的情况,但是这个接口的又不能直接用。这时候就需要考虑适配模式,去复用一些现成的类。得到想要的业务逻辑。
由于java是不支持多继承的而类的适配器模式就是通过多重继承来实现的所以现在讲的主要是对象适配器模式,
- 类图
适配器模式实现
目标接口Target
**
* @CLASSNAME Target
* @Description
* @Auther Jan 橙寂
* @DATE 2019/8/1 0001 22:22
*/
public class Target {
public void request()
{
System.out.println("这是普通请求");
}
}
Adaptee 需要适配的类
/**
* @CLASSNAME Adaptee
* @Description
* @Auther Jan 橙寂
* @DATE 2019/8/1 0001 22:24
*/
public class Adaptee {
public void request()
{
System.out.println("这是特殊请求");
}
}
Adapter适配器
/**
* @CLASSNAME Adapter
* @Description
* @Auther Jan 橙寂
* @DATE 2019/8/1 0001 22:25
*/
public class Adapter extends Target {
private Adaptee adaptee=new Adaptee();
@Override
public void request() {
adaptee.request();
}
}
客户端代码
/**
* @CLASSNAME Test
* @Description
* @Auther Jan 橙寂
* @DATE 2019/8/1 0001 22:28
*/
public class Test {
public static void main(String[] args) {
Target t=new Adapter();
t.request();//客户端调用的还是一样的接口但是逻辑确变了。
}
}
测试结果: 这是特殊请求
看完这个代码实现后对于适配器模式的理解是不是更深了。这时候我们来想想我开头提的两个问题
结论
- 什么是适配器模式?
对象适配器继承了目标类,调用了现存(有)的类的逻辑,或者新增的逻辑。这就是适配器模式。
- 什么情况下使用适配器模式?
看了上文,大家也许能想到,就是适配器模式,其实是亡羊补牢之举。如果最初设计的时候设计好了。就使用不到这个模式了。所以这个适配器模式在设计的时候是不推荐使用的。
但是话说回来,是软件就会有维护的那天,不同的厂家,不同的需求所以导致的功能也会发生变化。真到了我们的接口满足不了全部人的需求的时候,就需要使用到适配器模式了。当然如果能重构代码还是推荐重构代吗。
所以适配器模式主要用于双方都无法改变的时候才会去使用的。当然在设计之初也有要考虑到的时候,比如需要跟第三方打交道。这时候我们不可能为了去迎合他的需求去改变自己的接口。所以这时候就需要使用适配器模式。
注意:本文归作者所有,未经作者允许,不得转载