简单介绍适配器设计模式(内含代码分析)

适配器(Adapter Pattern) 就是有一个已有的类,但是这个类的接口和你的不一样,不能直接拿来使用,这个时候就需要使用适配器来帮你了.
    适配器的三个特点 : 
        适配器对象实现原有接口
        适配器对象组合一个实现新接口的对象(这个对象也可以不实现一个接口,只是一个单纯对象)
        对适配器原有接口方法的调用被委托给新接口的实例的特定的方法
模拟的场景 : 买了一个英标插头的插件(电器,使用3个插头的),但是国内的插座都是两个插头的,此时,就需要一个转接口使得在英标插头的电器也可以在国内进行充电,此时需要借助的是适配器设计模式
UML图 : 
 
步骤:
1 创建一个国际接口以及它的实现类
 1 /**
 2 * @Author : zhuhuicong
 3 * 2018/12/2 15:29
 4 * @Version 1.0
 5 * 国际插头
 6 */
 7 public interface CnPlugInterface {
 8 void chargewith2Pins(); //国际插头只能使用两个角的
 9 }
10 
11 public class CnPlugin implements CnPlugInterface {
12 @Override
13 public void chargewith2Pins() {
14 System.out.println("使用两个角的插座充电");
15 }
16 }
View Code

2创建一个英标的接口以及它的实现类

 1 /**
 2 * @Author : zhuhuicong
 3 * 2018/12/2 15:34
 4 * @Version 1.0
 5 * 英标插头
 6 */
 7 public interface EnPluginInterface {
 8 void chargeWith3Pins(); //英标插头使用的是3个角的充电
 9 }
10 
11 public class EnPlugin implements EnPluginInterface {
12 @Override
13 public void chargeWith3Pins() {
14 System.out.println("使用3个角的插座充电");
15 }
16 }
View Code

3模拟一个Home类(模拟一个在国内的家庭,只能使用国际插头)

 1 /**
 2 * @Author : zhuhuicong
 3 * 2018/12/2 15:30
 4 * @Version 1.0
 5 * 模仿在家充电的过程
 6 */
 7 public class Home {
 8 private CnPlugInterface cnPlug;
 9 
10 public Home() {
11 }
12 
13 public Home(CnPlugInterface cnPlug) {
14 this.cnPlug = cnPlug;
15 }
16 
17 public void setCnPlug(CnPlugInterface cnPlug) {
18 this.cnPlug = cnPlug;
19 }
20 
21 public void charge(){
22 cnPlug.chargewith2Pins(); //国际充电是使用的是2个角的
23 }
24 }
View Code

4新建一个适配器Adapter,功能是实现英标插头对国际插头的转换:

 1 /**
 2 * @Author : zhuhuicong
 3 * 2018/12/2 15:37
 4 * @Version 1.0
 5 * 适配器要求 :
 6 * 1 适配器必须实现原有旧的接口
 7 * 2 适配器对象中持有对新接口的引用,当调用就接口时,将这个调用委托给实现新接口的对象
 8 * 来处理,也就是在适配器对象中组合一个新接口
 9 */
10 public class PluginAdapter implements CnPlugInterface{
11 private EnPluginInterface enPlugin;
12 
13 public PluginAdapter() {
14 }
15 
16 public PluginAdapter(EnPluginInterface enPlugin) {
17 this.enPlugin = enPlugin;
18 }
19 
20 //适配器实现了英标的插头,然后重载国际的充电方法为英标的方法
21 @Override
22 public void chargewith2Pins() {
23 enPlugin.chargeWith3Pins();
24 }
25 }
View Code

5新建一个测试类进行模拟场景:

 1 /**
 2 * @Author : zhuhuicong
 3 * 2018/12/2 15:40
 4 * @Version 1.0
 5 */
 6 public class AdapterTest {
 7 public static void main(String[] args) {
 8 EnPluginInterface enPlugin = new EnPlugin(); //模拟的场景是买了个英标插头的插件
 9 Home home = new Home(); //模拟在国内的家庭
10 PluginAdapter pluginAdapter = new PluginAdapter(enPlugin); //使用适配器,转接口
11 home.setCnPlug(pluginAdapter);
12 home.charge(); //调用充电的方法
13 }
14 }
View Code

 

注明 : 以上整理的资料均来自实验楼学习网站.......
 
 
 
 
 
 
 
 
posted @ 2018-12-02 16:27  宋佑廉  阅读(293)  评论(0编辑  收藏  举报