zoukankan      html  css  js  c++  java
  • 公用技术——设计模式8——结构型模式——适配器模式

    1、问题

    适配器模式本质上是解决兼容性问题的,兼容性问题经常发生在以下这些场景

    1. 接口的内部升级,需要新接口兼容旧的接口
    2. 不同厂商之间的功能性兼容。例如投影仪厂商提供的接口是HDMI,笔记本电脑又不支持,只能提供适配器。

    适配器模式存在两种形式,类适配和接口适配,接口适配的使用场景更普遍。

           适配器模式的主要问题是:

    1. 旧接口无法满足新需求,必须对旧接口进行改造。
    2. 旧接口无法改变,原因可能是无法评估改变它的影响,也可能改动量过大,影响很大。也有可能是接口是第三方机构提供的,你无法改变。
    3. 现有接口无法使用,需要进行适配。

    它的解决方案是:

    1. 提供额外的适配器类,它与新接口的关系是实现关系,与旧接口的关系是组合关系。

    2、UML图

      

    3、代码

      旧接口,扮演Adaptee的角色

    /**
     * 
     * @File Name: OldInterface.java 
     * @Description: 旧接口,它是被适配者,扮演者Adaptee的角色
     * @version 1.0
     * @since JDK 1.8
     */
    public interface OldInterface {
    	/**
    	 * 
    	 * @Title: func
    	 * @Description:旧接口实现的功能
    	 */
    	void func();
    }
    

      新接口,扮演Target的角色

    /**
     * 
     * @File Name: NewInterface.java
     * @Description: 新接口,扮演者Target的角色, 它产生的原因大部分是旧接口无法满足新需求,需
    *对旧接口进行改造
     * @version 1.0
     * @since JDK 1.8
     */
    public interface NewInterface {
    	/**
    	 * 
    	 * @Title: func
    	 * @Description:新接口为了兼容老接口,必须要实现的方法
    	 */
    	void func();
    }
    

      适配器,扮演Adapter的角色

    /**
     * 
     * @File Name: Adapter.java
     * @Description: 适配器对象,扮演者Adapter对象,它是额外创建的
     * @version 1.0
     * @since JDK 1.8
     */
    public class Adapter implements NewInterface {
    	// 旧接口
    	private OldInterface old;
    
    	@Override
    	public void func() {
    		// 如果不需要改造,直接复用原接口方法即可 如果需要改造,例如添加一些额外的功能 总之需要保证新功能对旧功能的兼容性
    		otherFunc();
    		old.func();
    	}
    }
    

    4、讨论

    1.   问题1:适配器的主要功能是什么?

      答: 在不修改原有类结构体系的情况下,进行接口的升级改造。在不同厂商提供的接口下,提供额外的适配器类,使得它们可以达到协同的目的。第二种情况考虑现实情况的显示器适配器。

      2.  问题2:适配器的核心思想是什么?

      答: 在接口升级改造的情况下,适配器模式的核心思想就是open for extension,close for modification,它是指当需求变化时,不在原来的基础上修改,而是在原来的基础上扩展,本质就是添加新的类型,在适配器模式中添加的新类型就是Adapter类。它实现的目的也是Java语言的核心,解耦。

      在第二种情况下,只是为了解决不同厂商兼容性的问题。

    5、示例

    1. 第一种情况下可以参考,Logback框架中的Encoder接口和Layout接口的类结构体系。
    2. 第二种情况下也很常见,参考实际生活示例中的视频转换器。
  • 相关阅读:
    MySQL数据库时间查询
    MySQL函数转储存(当前月数据同步)
    字节数截取字符串
    JAVA 内部静态类--解析静态内部类的使用目的与限制
    Java集合框架学习总结
    JDBC中的Statement和PreparedStatement的区别
    java jdbc的优化之BeanUtils组件
    jdbc java数据库连接 11)中大文本类型的处理
    jdbc java数据库连接 10)批处理
    jdbc java数据库连接 9)事务编程
  • 原文地址:https://www.cnblogs.com/rain144576/p/9940904.html
Copyright © 2011-2022 走看看