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. 第二种情况下也很常见,参考实际生活示例中的视频转换器。
  • 相关阅读:
    UVALive 7509 Dome and Steles
    HDU 5884 Sort
    Gym 101194H Great Cells
    HDU 5451 Best Solver
    HDU 5883 The Best Path
    HDU 5875 Function
    卡特兰数
    UVa 11729 Commando War 突击战
    UVa 11292 The Dragon of Loowater 勇者斗恶龙
    Spark Scala Flink版本对应关系
  • 原文地址:https://www.cnblogs.com/rain144576/p/9940904.html
Copyright © 2011-2022 走看看