设计模式之适配器模式

news2024/12/29 10:57:01

设计模式之适配器模式

文章目录

  • 设计模式之适配器模式
    • 1. 定义
    • 2. 类型
    • 3. 场景
    • 4. 优点
    • 5. 缺点
    • 6. 适配器扩展
    • 6. 相关适配器模式
    • 7. coding
      • 7.1 被 适配者方法
      • 7.2 接口
      • 7.3 接口的实现
      • 7.4 适配者适配被适配者达到Target 目标
      • 7.5 类适配器的实现方式,其他的都不变
    • 8. 源码解析
      • 8.1 XmlAdapter
        • 8.1.1来源 javax.xml.bind.annotation.adapters
        • 8.1.2coding
        • 8.1.3 说明
      • 8.2 AdvisorAdapter
        • 8.2.1 来源
        • 8.2.2 coding
      • 8.3 JpaVendorAdapter
        • 8.3.1 来源
        • 8.3.2 coding

1. 定义

适配器模式主要用于将一个类的接口转化成客户端希望的目标类格式,使得原本不兼容的类可以在一起工作,将目标类和适配者类解耦;同时也符合“开闭原则”,可以在不修改原代码的基础上增加新的适配器类;将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性,但是缺点在于更换适配器的实现过程比较复杂。

2. 类型

结构型

3. 场景

已存在的类,它的方法和需求不匹配时(方法结果相同或相似)

4. 优点

提高类的透明性和复用,现有的类复用但不需要改变

目标类和适配器类解耦,提高程序扩展性

符合开闭原则

5. 缺点

适配器编写过程需要全面考虑,会增加系统的复杂性

增加系统阅读的阅读行

6. 适配器扩展

对象适配器

类适配器

6. 相关适配器模式

  1. 适配器模式和外观模式

适配器模式和外观模式都是对现有系统的封装,外观模式是定义新的接口,适配器模式是复用原有的接口,适配器模式是使已有的两个接口协同工作,而外观模式是提供一个更为方便的入口。

7. coding

7.1 被 适配者方法

package com.maidou.learning.design.structure.adapter.classadapter;

public class Adaptee {

    public void adapteeRequest() {
        System.out.println("被适配者");
    }
}

7.2 接口

package com.maidou.learning.design.structure.adapter.classadapter;

public interface Target {

    void request();
}

7.3 接口的实现

package com.maidou.learning.design.structure.adapter.classadapter;

public class ConcreteTarget implements Target{
    @Override
    public void request() {
        System.out.println("被适配者");
    }
}

7.4 适配者适配被适配者达到Target 目标

package com.maidou.learning.design.structure.adapter.classadapter;

public class Adapter extends Adaptee implements Target{
    @Override
    public void request() {
        super.adapteeRequest();
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7xfZeT6X-1666707488893)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221025213821425.png)]

测试

package com.maidou.learning.design.structure.adapter.classadapter;

public class MainTest {

    public static void main(String[] args) {
        Target target = new ConcreteTarget();
        target.request();

        Target target1 = new Adapter();
        target1.request();
    }
}

7.5 类适配器的实现方式,其他的都不变

package com.maidou.learning.design.structure.adapt1er.objectadapter;

public class Adapter implements Target{

    private Adaptee adaptee = new Adaptee();


    @Override
    public void request() {
        adaptee.adapteeRequest();
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XacAZwCS-1666707488898)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221025220134250.png)]

8. 源码解析

8.1 XmlAdapter

8.1.1来源 javax.xml.bind.annotation.adapters

8.1.2coding

   protected XmlAdapter() {}

    /**
     * Convert a value type to a bound type.
     *
     * @param v
     *      The value to be converted. Can be null.
     * @throws Exception
     *      if there's an error during the conversion. The caller is responsible for
     *      reporting the error to the user through {@link    javax.xml.bind.ValidationEventHandler}.
     */
    public abstract BoundType unmarshal(ValueType v) throws Exception;

    /**
     * Convert a bound type to a value type.
     *
     * @param v
     *      The value to be convereted. Can be null.
     * @throws Exception
     *      if there's an error during the conversion. The caller is responsible for
     *      reporting the error to the user through {@link javax.xml.bind.ValidationEventHandler}.
     */
    public abstract ValueType marshal(BoundType v) throws Exception;   

8.1.3 说明

实行xml的序列化方法和反序列方法进行数据的传输

8.2 AdvisorAdapter

8.2.1 来源

org.springframework.aop.framework.adapter

8.2.2 coding

public interface AdvisorAdapter {
    boolean supportsAdvice(Advice advice);

    MethodInterceptor getInterceptor(Advisor advisor);
}

在这里插入图片描述

实现方法

class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {
    MethodBeforeAdviceAdapter() {
    }

    public boolean supportsAdvice(Advice advice) {
        return advice instanceof MethodBeforeAdvice;
    }

    public MethodInterceptor getInterceptor(Advisor advisor) {
        MethodBeforeAdvice advice = (MethodBeforeAdvice)advisor.getAdvice();
        return new MethodBeforeAdviceInterceptor(advice);
    }
}

8.3 JpaVendorAdapter

8.3.1 来源

org.springframework.orm.jpa

8.3.2 coding

public interface JpaVendorAdapter {
    PersistenceProvider getPersistenceProvider();

    @Nullable
    default String getPersistenceProviderRootPackage() {
        return null;
    }

    default Map<String, ?> getJpaPropertyMap(PersistenceUnitInfo pui) {
        return this.getJpaPropertyMap();
    }

    default Map<String, ?> getJpaPropertyMap() {
        return Collections.emptyMap();
    }

    @Nullable
    default JpaDialect getJpaDialect() {
        return null;
    }

    default Class<? extends EntityManagerFactory> getEntityManagerFactoryInterface() {
        return EntityManagerFactory.class;
    }

    default Class<? extends EntityManager> getEntityManagerInterface() {
        return EntityManager.class;
    }

    default void postProcessEntityManagerFactory(EntityManagerFactory emf) {
    }

    default void postProcessEntityManager(EntityManager em) {
    }
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Django】REST_Framework框架——序列化器serializers源码解析

一、序列化器类——Serializer 1、序列化器的作用 序列化器的使用分两个阶段&#xff1a; 1、在客户端请求时&#xff0c;使用序列化器可以完成对数据的反序列化&#xff08;将字典格式的数据转化为模型对象&#xff09;。 2、在服务器响应时&#xff0c;使用序列化器可以完…

网络原理——No.4 传输层_TCP协议中的延迟应答, 捎带应答, 面向字节流与TCP的异常处理

JavaEE传送门JavaEE 网络原理——No.2 传输层_TCP的连接管理 网络原理——No.3 传输层_TCP的滑动窗口, 流量控制与拥塞控制 目录延迟应答捎带应答面向字节流粘包问题TCP 中的异常处理(连接异常)TCP 和 UDP 的应用场景延迟应答 一种提高传输效率的机制, 又是基于流量控制, 来引…

Appinventor——蓝牙app(蓝牙遥控器、串口助手、温湿度显示、切换界面蓝牙依旧保持连接)

App Inventor由谷歌实验室开发&#xff0c;移交麻省理工学院&#xff0c;是一款图形化编程环境&#xff0c;不需要复杂的变成语言&#xff0c;采用搭积木的方式编程&#xff0c;只需将组件拖入即可&#xff0c;简直就是不爱编程党的超级福音 本文搭建了一个蓝牙app&#xff0c…

【CSS】CSS基础认知【CSS基础知识详解】

&#x1f338;大家好&#xff0c;我是花无缺&#xff0c;一枚热爱生活的新时代青年&#xff0c;感谢你的阅读&#x1f970;~ &#x1f468;‍&#x1f4bb;个人主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专…

女朋友说她累了之后依然在线,于是20行代码写了个小工具康康发生了什么

近发现女朋友一到晚上总是很忙的样子&#xff0c; 每晚匆匆忙忙道过晚安就说自己累了去睡觉。 是我哪里做的不对吗… 睡就睡了&#xff0c;可是&#xff0c;QQ头像却会偶尔亮起来&#xff0c; 我非常担心&#xff0c;是不是账号被盗了呢&#xff1f; 然后&#xff0c;就想帮…

Django全家桶

Django框架从入门到高级 &#xff08;一&#xff09;Django入门 Web应用 详细地址见&#xff1a;https://blog.csdn.net/DiligentGG/article/details/126606099?spm1001.2014.3001.5501 Web框架本质 web框架本质上可以看成是一个功能强大的socket服务端&#xff0c;用户的…

Android专有GitHook完结篇,发布到npm

系列文章目录 Android打造专有hook&#xff0c;让不规范的代码扼杀在萌芽之中 Android打造专有hook第二篇&#xff0c;走进规范第一步 Android打造专有Hook第三篇&#xff0c;实战全量代码规范检查 Android打造专有Hook第四篇&#xff0c;实战增量代码规范检查 Hello啊各位…

【NLP】词向量

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

阿里巴巴面试题- - -多线程并发篇(三十)

前言:七月末八月初的时候,秋招正式打响,公司会放出大量的全职和实习岗位。为了帮助秋招的小伙伴们,学长这里整理了一系列的秋招面试题给大家,所以小伙伴们不用太过焦虑,相信你们一定能超常发挥,收到心仪公司的Offer~~ 内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elast…

窥一斑而知全豹,从五大厂商看MCU国产化的机遇和挑战

&#x1f446;&#x1f446;&#x1f446; #电巢直播10月26日&#xff08;周三&#xff09;扫码参与 前言 近年来&#xff0c;MCU在各领域的应用大幅度增加。2021年全球MCU的总出货量仍旧增长12%&#xff0c;使去年全球MCU的交付量达到了309亿片的历史新高。根据IC Insights…

工业控制系统安全评估流程系统评定与分类

综述 随着计算机和网络技术的发展&#xff0c;特别是信息化与工业化## 综述 随着计算机和网络技术的发展&#xff0c;特别是信息化与工业化深度融合以及物联网的快速发展&#xff0c;工业控制 系统产品越来越多地采用通用协议、通用硬件和通用软件&#xff0c;网络威胁正在由传…

Linux文件属性与权限

目录 前言 文件权限类 文件属性 rwx 作用文件和目录的不同解释 chmod 改变权限 1&#xff09;基本语法 2&#xff09;经验技巧 3&#xff09;案例实操 chown 改变所有者 1&#xff09;基本语法 2&#xff09;选项说明 3&#xff09;实操案例 chgrp 改变所属组 …

康为世纪科创板上市破发:跌幅超10% 公司市值41亿

雷递网 雷建平 10月25日江苏康为世纪生物科技股份有限公司&#xff08;简称&#xff1a;“康为世纪”&#xff0c;股票代码为“688426”&#xff09;今日在科创板上市。康为世纪此次发行价为48.98元&#xff0c;发行2329万股&#xff0c;募资总额为11.4亿元。康为世纪开盘价为4…

【单片机毕业设计】【mcuclub-jj-048】基于单片机的水表的设计

最近设计了一个项目基于单片机的水表系统&#xff0c;与大家分享一下&#xff1a; 一、基本介绍 项目名&#xff1a;水表 项目编号&#xff1a;mcuclub-jj-048 单片机类型&#xff1a;STC89C52 具体功能&#xff1a; 1、通过继电器控制水泵&#xff0c;将水抽出经过流速传感器…

Redis实战篇一 (短信登录)

Redis企业实战&#xff08;黑马点评&#xff09;项目整体架构项目部署后端部署前端部署短信登陆基于Session实现登录集群的Session共享问题基于Redis实现共享session登录解决状态登录刷新的问题——登录拦截器的优化本期学习路线短信登陆: Redis的共享session应用 商户查询缓存…

jar包突然过大解决方法,解决ffmpeg剪辑视频导致jar过大

jar包突然过大解决方法 缘由&#xff1a; ​ 项目中要需要用到视频文件&#xff0c;为了方便用户使用&#xff0c;那么页面中就需要增加视频剪辑的相关功能&#xff0c;让用户上传视频后能够自定义的进行剪辑&#xff0c;对自己的视频做出相应的更改 结果&#xff1a; ​ 打jar…

Vue复刻华为官网 (二)

文章目录1 推荐信息1.1 思路1.2 代码1.3 知识补充1.4 效果图2 宣传海报2.1 思路2.2 代码2.3 效果图3 新闻与活动3.1 思路3.2 代码3.3 效果图1 推荐信息 1.1 思路 看了这个gif后&#xff0c;可以清楚的看到产生了三个动画效果&#xff1a;图片"拉近"&#xff0c;"…

js 实现页面隐藏、关闭、刷新给出对应的提示

我们在做项目的时候经常会遇到一些需求&#xff0c;比如在某些页面当点击浏览器刷新 或者关闭的时候会有对应的提示&#xff0c;是否离开或者重新加载此网站。比如csdn写文章的时候就有这个弹窗&#xff0c;这功能就是用onbeforeunload实现的。 注意&#xff1a;如果你加载下面…

学会用Linux用户管理命令

目录 useradd 添加新用户 1&#xff09;基本语法 2&#xff09;案例实操 passwd 设置用户密码 1&#xff09;基本语法 id 查看用户是否存在 1&#xff09;基本语法 2&#xff09;案例实操 cat /etc/passwd 查看创建了哪些用户 1&#xff09;案例实操 su 切换用户 1…

Linux基本工具(上)

目录 粘滞位&#xff1a;t yum yum install yum list ​编辑 yum list | grep 软件名 yum search 软件名 软件卸载&#xff1a;yum remove rz sz表示下载&#xff1a; Linux开发工具&#xff1a; vim编辑器&#xff1a; vim的几种模式&#xff1a; 粘滞位&#xff1a…