适配器模式(Adapter Pattern),作用是将一个现有功能类,适配成我期望的类,期望的类就是其中的功能都是我当前想要的功能。
比如我现在有一个已实现的业务类HandleA,但是不符合我现在的业务需求,但是HandleA中的部分功能是可以用的,也就是部分功能符合需求,另一部分不符合需求。
这时我们该怎么做,有的同学说,直接在HandleA中扩展,这确实可以,但是这明显不符合开闭原则,所以这时候我们就新建一个类,在新的类中,基于HandleA来扩展或修改功能。
我们在下面的代码中详细讲解。
在演示代码之前,还需要说明的是,适配器模式分为两种,一种是类的适配器,另一种是对象的适配器。
我们先来看类的适配器,我们演示的demo就以开篇的HandleA适配为例来讲解。
类的适配器
1、新建被适配业务抽象类IHandleA
package com.itzhimei.study.design.adapter.classadapter;
/**
* @Auther: www.itzhimei.com
* @Description: 业务类A--被适配对象(原有的部分功能满足我的需求)
*/
public interface IHandleA {
/**
* 业务方法a1
*/
void a1();
/**
* 业务方法a2
*/
void a2();
/**
* 业务方法c
*/
void c();
}
2、新建被适配业务实现类HandleA
package com.itzhimei.study.design.adapter.classadapter;
/**
* @Auther: www.itzhimei.com
* @Description: 被适配者
*/
public class HandleA implements IHandleA {
@Override
public void a1() {
System.out.println("执行HandleA的a1方法");
}
@Override
public void a2() {
System.out.println("执行HandleA的a2方法");
}
@Override
public void c() {
System.out.println("执行HandleA的c方法");
}
}
3、定义抽象目标抽象类IHandleB
package com.itzhimei.study.design.adapter.classadapter;
/**
* @Auther: www.itzhimei.com
* @Description: 目标业务类B
*/
public interface IHandleB {
/**
* 业务方法b1
*/
void b1();
/**
* 业务方法b2
*/
void b2();
/**
* 业务方法c
*/
void c();
}
4、定义实现目标类HandleB
package com.itzhimei.study.design.adapter.classadapter;
/**
* @Auther: www.itzhimei.com
* @Description: HandleB为目标类
*/
public class HandleB extends HandleA implements IHandleB {
@Override
public void b1() {
super.a1();
System.out.println("HandleA的a1方法不满足需求,进行扩展和改造,执行HandleB的b1方法");
}
@Override
public void b2() {
System.out.println("HandleA的a2方法不满足需求,进行扩展和改造,执行HandleB的b2方法");
}
}
重点理解这里:
HandleB中继承了HandleA,那么HandleB就具备了HandleA的所有功能,我们假设HandleA的a1()和a()方法不符合我们的预期,需要改造,b1中使用了HandleA的a1方法,同时也进行了扩展。b2中完全重新实现了新逻辑,c方法没有重写,是因为符合我们的需求,所以就直接用了HandleA的c方法。
三个方法模拟的三个需求场景。
5、测试
package com.itzhimei.study.design.adapter.classadapter;
/**
* @Auther: www.itzhimei.com
* @Description: 测试
*/
public class Client {
public static void main(String[] args) {
IHandleB handleB = new HandleB();
handleB.b1();
handleB.b2();
handleB.c();
}
}
输出:
-----------b1方法执行结果-----------
执行HandleA的a1方法
HandleA的a1方法不满足需求,进行扩展和改造,执行HandleB的b1方法
-----------b2方法执行结果-----------
HandleA的a2方法不满足需求,进行扩展和改造,执行HandleB的b2方法
-----------c方法执行结果-----------
执行HandleA的c方法
从结果再理解一下适配器模式。
类的适配器一句话总结就是基于继承关系实现的适配。
类的适配器类结构图:
我们下一节来讲解适配器模式的对象适配器。