适配器模式

文章目录

适配器模式

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

比如充电,插座的电压为 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();
    }


}
相关推荐
小bo波4 小时前
使用Thread子类创建线程 VS 使用Runnable接口创建线程的区别
java·多线程·thread·并发编程·runnable
SamDeepThinking4 小时前
高并发场景下,CompletableFuture与ForkJoinPool该如何取舍?
java·后端·面试
张不才7 小时前
CPU 100% 了怎么办?Java 性能排障的标准化操作
java·后端
shepherd1119 小时前
吞吐量提升 10 倍:高并发大批量数据处理任务的架构演进与性能调优
java·后端·架构
plainGeekDev11 小时前
单例模式 → object 声明
android·java·kotlin
用户2986985301412 小时前
Java 实现 Word 文档文本与图片提取的方法
java·后端
SimonKing13 小时前
铁子,IntelliJ IDEA 2026.1.3来了,升不升?
java·后端·程序员
咖啡八杯1 天前
GoF设计模式——策略模式
java·后端·spring·设计模式
用户128526116021 天前
我把祖传Java项目重构后,接口响应从3s砍到了200ms,只改了这几行代码
java