Java 设计模式之适配器学习与掌握

Posted 邹奇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 设计模式之适配器学习与掌握相关的知识,希望对你有一定的参考价值。

定义与特点

  • 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高


优点

  • 在很多业务场景中符合开闭原则。
  • 客户端通过适配器可以透明地调用目标接口。
  • 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
  • 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。

缺点

  • 适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性。
  • 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。

模式的结构与实现

模式的结构

适配器模式(Adapter)包含以下主要角色:

  • 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  • 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  • 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

类适配器模式实现

目标接口,如下:

package com.example.designmodedemo.principle.adapter;

/**
 * 目标接口
 */
public interface Target {

    void show();

}

适配者,如下:

package com.example.designmodedemo.principle.adapter;

/**
 * 适配者
 */
public class MyAdaptee {

    public void doBusiness(){
        System.out.println(":> 适配者业务调用");
    }

}

类适配器类,如下:

package com.example.designmodedemo.principle.adapter;

/**
 * 类适配器类
 */
public class ClassAdapter extends MyAdaptee implements Target{

    @Override
    public void show() {
        doBusiness();
    }

}

客户端,调用如下:

Target target = new ClassAdapter();
target.show();

对象适配器模式实现

这里的目标接口适配者类同类适配器的一样,这里不再给出。

对象适配器,如下:

package com.example.designmodedemo.principle.adapter;

/**
 * 对象适配类
 */
public class ObjectAdapter implements Target{

    private MyAdaptee adapter;

    public ObjectAdapter(MyAdaptee adapter) {
        this.adapter = adapter;
    }

    @Override
    public void show() {
        if (adapter != null){
            adapter.doBusiness();
        }
    }
}

客户端,调用代码如下:

Adaptee adaptee = new Adaptee();
Target target = new ObjectAdapter(adaptee);
target.show();

模式应用场景

适配器模式(Adapter)通常适用于以下场景:

  • 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。
  • 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。

模式的扩展

  • 适配器模式(Adapter)可扩展为双向适配器模式,双向适配器类既可以把适配者接口转换成目标接口,也可以把目标接口转换成适配者接口。

代码如下:

package com.example.designmodedemo.principle.adapter;

/**
 * 双向适配器模式
 */
public class Both {

    // 目标者接口
    public interface Target{
        void targetBusiness();
    }

    // 适配者接口
    public interface Adaptee{
        void adapteeBusiness();
    }

    // 目标实现
    public static class TargetIml implements Target{
        @Override
        public void targetBusiness() {
            System.out.println(":> 目标代码调用");
        }
    }

    // 适配者实现
    public static class AdapteeIml implements Adaptee{
        @Override
        public void adapteeBusiness() {
            System.out.println(":> 适配者代码调用");
        }
    }

    // 双向适配器
    public static class BothAdapter implements Target, Adaptee{

        private Target target;
        private Adaptee adaptee;

        public BothAdapter(Target target) {
            this.target = target;
        }

        public BothAdapter(Adaptee adaptee) {
            this.adaptee = adaptee;
        }

        @Override
        public void targetBusiness() {
            if (adaptee != null){
                adaptee.adapteeBusiness();
            }
        }

        @Override
        public void adapteeBusiness() {
            if (target != null){
                target.targetBusiness();
            }
        }
    }

}

客户端,调用代码如下:

		// 目标通过双向适配器访问适配者
        Both.Adaptee adaptee = new Both.AdapteeIml();
        Both.BothAdapter target = new Both.BothAdapter(adaptee);
        target.targetBusiness();

        // 适配者通过双向适配器访问目标
        Both.Target target1 = new Both.TargetIml();
        Both.BothAdapter adaptee1 = new Both.BothAdapter(target1);
        adaptee1.adapteeBusiness();

技术永不眠!我们下期见!

以上是关于Java 设计模式之适配器学习与掌握的主要内容,如果未能解决你的问题,请参考以下文章

Java 设计模式之策略学习与掌握

Java 设计模式之策略学习与掌握

Java 设计模式之模板方法学习与掌握

Java 设计模式之模板方法学习与掌握

Java 设计模式之迭代器学习与掌握

Java 设计模式之迭代器学习与掌握