适配器模式的目的就是将原来两个不兼容接口的类可以适配在一起工作。举一个现实中的例子,笔记本电脑和投影仪的适配。现在有些笔记本(可能较多,没做统计不细究了)对外只开放USB、TypeC接口了,就对投影仪来说,就需要另外弄个投影转换器,也可称之为适配器哈。下面就拿这样的例子,结合代码,描述一下适配器模式是怎么样的。
首先先放出UML图:
没几个类,结构比较简单。
说明下这几个类和接口是什么:
1、ProjectorComputer:相当于只有USB接口的电脑;
2、Shadow:相当于USB接口;
3、ProjectorAdapter:相当于适配器;
4、ProjectorShadow:相当于投影仪接口;
5、Projector:相当于投影仪;
先看看两个接口,接口不同其实现方法自然也不同:
package com.minant.adapter;
/**
* @ClassName Shadow
* @Description TODO USB投影接口
* @Author MinAnt
* @Date 2020/5/21
* @Version V1.0
*/
public interface Shadow {
void show();
}
package com.minant.adapter;
/**
* @ClassName ProjectorShadow
* @Description TODO 投影仪接口
* @Author MinAnt
* @Date 2020/5/21
* @Version V1.0
*/
public interface ProjectorShadow {
void run();
}
再看投影仪的实现功能:
package com.minant.adapter;
/**
* @ClassName Projector
* @Description TODO 投影仪
* @Author MinAnt
* @Date 2020/5/21
* @Version V1.0
*/
public class Projector implements ProjectorShadow{
@Override
public void run() {
System.out.println("投放大屏电影!");
}
}
关键的适配器实现,对于适配器而言,对两接口肯定是要有关系的,要不就起不到连接适配的作用。怎么做呢?因为是要对USB接口和投影仪接口的适配,所以这里适配器的实现通过实现USB接口,再对投影仪接口组合从而达到适配。利用组合关系,这里还可以对其它接口进行适配,扩展性就由组合关系体现出来了。对现实中呢就是多功能适配转换器的道理,有网口的、耳机的、投影的等等。
package com.minant.adapter;
/**
* @ClassName ProjectorAdapter
* @Description TODO 投影仪适配器
* @Author MinAnt
* @Date 2020/5/21
* @Version V1.0
*/
public class ProjectorAdapter implements Shadow {
private ProjectorShadow pshadow;
public ProjectorAdapter(ProjectorShadow pshadow) {
this.pshadow = pshadow;
}
@Override
public void show() {
this.pshadow.run();
}
}
验证适配:
package com.minant.adapter;
/**
* @ClassName ProjectorComputer
* @Description TODO 投影电脑
* @Author MinAnt
* @Date 2020/5/21
* @Version V1.0
*/
public class ProjectorComputer {
// USB接口
public void computerUsb(Shadow shadow) {
shadow.show();
}
public static void main(String[] args) {
// 电脑
ProjectorComputer computer = new ProjectorComputer();
// 投影仪
ProjectorShadow projector = new Projector();
// 适配器连接
Shadow shadow = new ProjectorAdapter(projector);
computer.computerUsb(shadow);
}
}
通过适配器连接电脑,连接投影仪,可以实现电脑投影功能:
适配器模式到此结束,本人能力有限,有不足之处还请各位不吝赐教。