设计模式之适配器模式
创始人
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、文言文  北人生而不识菱者,仕于南方。席上啖菱,并壳入口...
李白传读后感 李白传读后感(精选5篇)  读完一本名著以后,你心中有什么感想呢?这时候,最关键的读后感怎么能落下!...
梦游天姥吟留别高考语文考点 梦游天姥吟留别高考语文考点  原文:  海客谈瀛洲,烟涛微茫信难求,越人语天姥,云霞明灭或可睹。天姥...
乡愁体的作文600字 乡愁体的作文600字  《乡愁》以朴素、简明、隽永的语言,高超的艺术技巧,表达了台湾人民盼望海峡两岸...
《长干曲其二》的原文赏析及翻... 《长干曲其二》的原文赏析及翻译注释  长干曲 其二  崔颢  家临九江水,来去九江侧。  同是长干人...
《山海经》异兽介绍 《山海经》异兽介绍  山海经里的奇珍异兽很多,是集齐古人智慧与想象力的书。小编整理了《山海经》异兽介...
红楼梦读后感300字 红楼梦读后感300字(通用11篇)  当看完一本著作后,想必你有不少可以分享的东西,此时需要认真地做...
《名人传》简介   《名人传》简介  作者介绍:  罗曼·罗兰(Romain Rolland,1866——1944)...
《小石潭记》中考真题 历年语文高考真题与答案推荐度:历年英语高考真题与答案推荐度:高考语文全国乙卷真题和答案推荐度:新高考...
林采薇简介 林采薇简介  林采薇(Yumi ),3月5日出生于台湾台北。就读于台湾辅仁大学韩语系,现为伊林模特儿...
《水调歌头再用韵呈南涧》诗词 《水调歌头再用韵呈南涧》诗词  水调歌头 再用韵呈南涧 辛弃疾 宋  千古老蟾口,云洞插天开。涨痕当...
将进酒 李白拼音版 将进酒 李白拼音版  qiāng jìn jiǔ  将 进 酒  jūn bú jiàn huáng...
三字经全文句句赏析 三字经全文句句赏析  rén zhī chū xìng běn shàn xìng xiāng jì...
《陋室铭》作者 《陋室铭》作者  刘禹锡(772-842),字梦得,汉族,中国唐朝彭城(今徐州)人,祖籍洛阳,唐朝文...
同儿辈赋未开海棠原文 同儿辈赋未开海棠原文  同儿辈赋未开海棠原文:  元好问  原文:  枝间新绿一重重,小蕾深藏数点红...
王之涣《登黄鹤楼》全文赏析 王之涣《登黄鹤楼》全文赏析  《登鹳雀楼》是唐代诗人王之涣(一作朱斌诗)创作的一首诗。人们对于王之涣...
诗经名篇 诗经名篇  《诗经》内容丰富,反映了劳动与爱情、战争与徭役、压迫与反抗、风俗与婚姻、祭祖与宴会,甚至...
岳阳楼记原文及翻译讲解 岳阳楼记原文及翻译讲解  原文  庆历四年春,滕子京谪(zhé)守巴陵郡。越明年,政通人和,百废具兴...
劝学诗/偶成原文、注释及赏析 劝学诗/偶成原文、注释及赏析  赏析,是一个汉语词汇,意思是欣赏并分析(诗文等),通过鉴赏与分析得出...
带拼音的《三字经》全文 带拼音的《三字经》全文  这篇文章适合刚学习拼音的小朋友们,带拼音的《三字经》全文,不仅能学习国学《...