深入浅出适配器模式

简介: 深入浅出适配器模式

深入浅出适配器模式

简介

在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

网络异常,图片无法展示
|


对象适配器模式

在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。

类适配器模式

这种适配器模式下,适配器继承自已实现的类(一般多重继承)

适配器模式思想:

网络异常,图片无法展示
|


适配器模式的宗旨:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。

优点:

  • 可以让任何两个没有关联的类一起运行。
  • 提高了类的复用。
  • 增加了类的透明度。
  • 灵活性好。

缺点:

  • 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
  • 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

代码实例

描述:

定义一个插座接口MySocket,方法为doTake(插口类型,使用者名字),对插座类的扩展接口MySuperSocket,有具体的插口功能实现,如TypeA和TypeB的实现,适配器类MySocketAdapter对插座接口进行了实现,并依赖MySuperSocket可以不同的接口进行充电,UseMySocket为直接面向用户的类,依赖适配器类,可以对不同类型的接口进行适配,最高程度的满足用户的需求

类关系图:

网络异常,图片无法展示
|


代码:

public class Adapter {
    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        UseMySocket socket = new UseMySocket();
        socket.doTake("A","张零");
        socket.doTake("B","张一");
        socket.doTake("C","张二");
        socket.doTake("D","张三");
    }
}
/**
 * 插座
 */
interface MySocket {
    /**
     * 默认接口
     */
    void doTake(String type, String name);
}
interface MySuperSocket {
    /**
     * A型接口
     */
    void typeA(String name);
    /**
     * B型接口
     */
    void typeB(String name);
}
/**
 * B型插座类
 */
class TypeBSocketer implements MySuperSocket {
    @Override
    public void typeA(String name) {
         //空实现
         return;
    }
    @Override
    public void typeB(String name) {
        System.out.println(name + " Use TypeB");
    }
}
/**
 * A型插座类
 */
class TypeASocketer implements MySuperSocket {
    @Override
    public void typeA(String name) {
        System.out.println(name + " Use TypeA");
    }
    @Override
    public void typeB(String name) {
        //空实现
        return;
    }
}
/**
 * 适配器类
 */
class MySocketAdapter implements MySocket {
    private MySuperSocket superSocket;
    public MySocketAdapter(String type) {
        if ("A".equals(type)) {
            superSocket = new TypeASocketer();
        } else if ("B".equals(type)) {
            superSocket = new TypeBSocketer();
        }
    }
    @Override
    public void doTake(String type, String name) {
        if ("A".equals(type)) {
            superSocket.typeA(name);
        } else if ("B".equals(type)) {
            superSocket.typeB(name);
        }
    }
}
/**
 * 直接面向用户的类
 */
class UseMySocket implements MySocket {
    private MySocketAdapter mySocketAdapter;
    @Override
    public void doTake(String type, String name) {
        if ("C".equals(type)) {
            System.out.println(name+" Use TypeC");
        } else if ("A".equals(type) || "B".equals(type)) {
            mySocketAdapter = new MySocketAdapter(type);
            mySocketAdapter.doTake(type, name);
        } else {
            System.out.println(name + " Not Find Type To Use");
        }
    }
}
复制代码


测试结果:

public class Adapter {
    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        UseMySocket socket = new UseMySocket();
        socket.doTake("A","张零");
        socket.doTake("B","张一");
        socket.doTake("C","张二");
        socket.doTake("D","张三");
    }
}
复制代码


网络异常,图片无法展示
|


相关文章
|
7天前
|
人工智能 运维 安全
|
5天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
607 21
|
12天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
970 110
|
6天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。