设计模式之适配器模式
创始人
2024-01-17 02:54:17
0

设计模式之适配器模式

文章目录

  • 设计模式之适配器模式
    • 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{@Overridepublic void request() {System.out.println("被适配者");}
}

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

package com.maidou.learning.design.structure.adapter.classadapter;public class Adapter extends Adaptee implements Target{@Overridepublic 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();@Overridepublic 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();@Nullabledefault String getPersistenceProviderRootPackage() {return null;}default Map getJpaPropertyMap(PersistenceUnitInfo pui) {return this.getJpaPropertyMap();}default Map getJpaPropertyMap() {return Collections.emptyMap();}@Nullabledefault JpaDialect getJpaDialect() {return null;}default Class getEntityManagerFactoryInterface() {return EntityManagerFactory.class;}default Class getEntityManagerInterface() {return EntityManager.class;}default void postProcessEntityManagerFactory(EntityManagerFactory emf) {}default void postProcessEntityManager(EntityManager em) {}
} 

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...