设计模式之 适配器模式上 类适配器

适配器模式(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方法

从结果再理解一下适配器模式。

类的适配器一句话总结就是基于继承关系实现的适配。

类的适配器类结构图:

我们下一节来讲解适配器模式的对象适配器。