适配器模式

文章目录

适配器模式

适配器模式,客户端通过适配器返回客户端期望的接口。其中适配器将被适配者转化为客户端期望的接口。

比如充电,插座的电压为 220V(被适配者),手机(客户端)通过充电器(适配器)将插座的电压降到 5 V(目标接口)传输电压给手机(客户端)。

种类:类适配器,接口适配器,对象适配器。

适配器模式的角色

  • 客户端:通过适配器访问目标接口
  • 适配器
  • 被适配器
  • 目标接口

类适配器

适配器 adapter 必须继承被适配者,实现目标接口。

案例

代码

被适配者
java 复制代码
/**
 *  被适配者
 *
 * @author: Hui
 **/
public class Adaptee {

    public String method(){
        System.out.println("调用被适配者方法");
        return "被适配者方法";
    }

}
目标接口
java 复制代码
/**
 *  目标对象
 *
 * @author: Hui
 **/
public interface ITarget {

    public String method1();
}
适配器
java 复制代码
/**
 *  适配器
 *
 * @author: Hui
 **/
public class Adapter extends Adaptee implements ITarget{


    @Override
    public String method1() {

        //适配器方法,将原有的方法进行适配
        System.out.println("调用适配器方法");
        String adapteeMenthod = method();
        System.out.println("将被适配器方法进行调整");
        adapteeMenthod = adapteeMenthod.replaceAll("被适配者方法","适配器方法");
        System.out.println("调整成功");
        return adapteeMenthod;
    }
}
客户端使用
java 复制代码
/**
 *  客户端
 *
 * @author: Hui
 **/
public class Client {
    public static void main(String[] args) {
        Adapter adapter = new Adapter();
        String s = adapter.method1();
        System.out.println(s);
    }

}

对象适配器

因为类适配器需要适配器去继承被适配者,不符合合成复用原则,使用对象适配器可以解决这一问题,将被适配者聚合到适配器中。

案例

代码

因为只在上述的类加载器的基础上修改了适配器,所以只贴出适配器的与客户端的代码,其余与类加载器一致。

适配器
java 复制代码
/**
 * 适配器
 *
 * @author: Hui
 **/
public class Adapter implements ITarget {


    private Adaptee adaptee;

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


    @Override
    public String method1() {

        //适配器方法,将原有的方法进行适配
        System.out.println("调用对象适配器方法");
        String adapteeMenthod = null;
        if (adaptee != null) {
            adapteeMenthod = adaptee.method();
            System.out.println("将被适配器方法进行调整");
            adapteeMenthod = adapteeMenthod.replaceAll("被适配者方法", "适配器方法");
            System.out.println("调整成功");
        }

        return adapteeMenthod;
    }
}
客户端
java 复制代码
/**
 *  客户端
 *
 * @author: Hui
 **/
public class Client {
    public static void main(String[] args) {
        Adapter adapter = new Adapter(new Adaptee());
        String s = adapter.method1();
        System.out.println(s);
    }

}

接口适配器

定义一个多个方法的接口,使用抽象父类来实现该接口并实现接口中的所有方法,子类要使用的话使用覆盖其中的一个方法就可以了。

案例

代码

接口
java 复制代码
package adaper.interfaceAdapter;

/**
 * 作者:灰爪哇
 * 时间:2024-07-18
 * 接口:提供多个方法
 *
 */
public interface ITarget {

    void method1();

    void method2();

    void method3();
}
抽象适配器
java 复制代码
/**
 *
 *
 * @author: Hui
 **/
public abstract class AbsAdapter implements ITarget{
    @Override
    public void method1() {

    }

    @Override
    public void method2() {

    }

    @Override
    public void method3() {

    }
}
客户端
java 复制代码
/**
 *
 *
 * @author: Hui
 **/
public class Client {
    public static void main(String[] args) {
        AbsAdapter absAdapter = new AbsAdapter() {
            @Override
            public void method1() {
                System.out.println("method1 开始执行~~~~  ");
            }
        };

        absAdapter.method1();
    }


}
相关推荐
繁星蓝雨8 分钟前
C++设计原理——异常处理
java·c++·异常处理·noexcept·throw·try catch
BerrySen17826 分钟前
一个Java项目改成AI流程后,最难的部分完全变了
java·大数据·人工智能·可观测性·大模型应用开发·工程思维
2401_8949155329 分钟前
Geo优化系统源码部署搭建技术——PHP程序开发部署指南
开发语言·php
wuyk55532 分钟前
67.嵌入式C语言进阶:结构体指针实战指南——STM32外设、传感器数据访问的高效技巧
c语言·开发语言·stm32·单片机
程序猿秃头之路36 分钟前
DDD 系列:DTO、VO、DO、Entity 怎么区分
java·ddd·领域驱动设计
找磁材38 分钟前
空心杯电机与永磁体
开发语言·磁性材料·钕铁硼·磁钢
我不管我就要叫小猪1 小时前
C/C++----命名空间
c语言·开发语言·c++
兮动人1 小时前
Python字符串类型
开发语言·python·python字符串类型
自由随风飘1 小时前
JAVA中的面向对象-3
java·开发语言
小羊先生car2 小时前
RTOS-F429-HAL-(动/静态)任务的创建(2026/7/27)
开发语言·算法·c#