设计模式之 适配器模式 下 对象适配器

对象适配器简单来说就是目标类通过持有一个被适配的类的对象,来完成改造,让目标类的功能最终符合需求。

基于上一节的示例和说明,我们在本节直接演示对象适配器。

1、被适配抽象业务类IHandleA

package com.itzhimei.study.design.adapter.objectadapter;

/**
 * @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.objectadapter;

/**
 * @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.objectadapter;

/**
 * @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.objectadapter;

/**
 * @Auther: www.itzhimei.com
 * @Description:
 */
public class HandleB implements IHandleB {

    private IHandleA handleA;

    public HandleB(IHandleA handleA) {
        this.handleA = handleA;
    }

    @Override
    public void b1() {
        this.handleA.a1();
        System.out.println("HandleA的a1方法不满足需求,进行扩展和改造,执行HandleB的b1方法");
    }

    @Override
    public void b2() {
        System.out.println("HandleA的a2方法不满足需求,进行扩展和改造,执行HandleB的b2方法");
    }

    @Override
    public void c() {
        this.handleA.c();
    }
}

重点在这里:

这里的HandleB,没有像类的适配器去继承HandleA,是在HandleB自己内部持有一个HandleA的成员属性,然后在HandleB自己的各个方法中调用HandleA这个成员属性的方法,来即拥有的HandleA的功能,同时也能根据HandleB自己的需要在各个b方法中进行改造或重写逻辑。

5、测试

package com.itzhimei.study.design.adapter.objectadapter;

/**
 * @Auther: www.itzhimei.com
 * @Description: 对象的适配器--测试
 */
public class Client {

    public static void main(String[] args) {
        //被适配对象
        IHandleA handleA = new HandleA();
        //适配后的对象
        IHandleB handleB = new HandleB(handleA);
        System.out.println("-----------b1方法执行结果-----------");
        handleB.b1();
        System.out.println("-----------b2方法执行结果-----------");
        handleB.b2();
        System.out.println("-----------c方法执行结果-----------");
        handleB.c();
    }
}

输出:

-----------b1方法执行结果-----------
执行HandleA的a1方法
HandleA的a1方法不满足需求,进行扩展和改造,执行HandleB的b1方法
-----------b2方法执行结果-----------
HandleA的a2方法不满足需求,进行扩展和改造,执行HandleB的b2方法
-----------c方法执行结果-----------
执行HandleA的c方法

以上就是对象适配器模式的实现。

对象适配器的类结构图: