zoukankan      html  css  js  c++  java
  • 结构型模式之Adapter模式

    适配器模式把一个类的接口变换成客户端所期待的另一种接口。

    在JDK中的体现

    把一个接口或类变成另外一种。

    java.util.Arrays#asList()
    javax.swing.JTable(TableModel)
    java.io.InputStreamReader(InputStream)
    java.io.OutputStreamWriter(OutputStream)
    javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
    javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()

    参与角色

    目标角色(Target): 定义Client使用的与特定领域相关的接口,即期待得到的接口。
    客户角色(Client):与符合Target接口的对象协同。
    被适配橘色(Adaptee):定义一个已经存在并已经使用的接口,这个接口需要被适配。
    适配器角色(Adapte):适配器模式的核心。
    它将对被适配Adaptee角色已有的接口转换为目标角色Target匹配的接口,对Adaptee的接口与Target接口进行适配.

    适配器模式实例

    /**
     * 所期待得到的接口
     */
    public interface Target {
    
    	/**类似中国的电源接口*/
    	public void expectMethod();
    }
    

      

    /**
     * 需要被适配的接口,类似国外的电源接口
     */
    public class Adaptee {
    
    	/**德国电源插口*/
    	public void notMatchMethod(){
    		System.out.println("这是待适配的德国电源插口__");
    	}
    }
    

      

    1.类适配器模式

    /**
     * 类适配器模式
     * 适配器角色Adapter扩展了Adaptee,同时又实现了目标(Target)接口。
     */
    public class Adapter1 extends Adaptee implements Target{
    
    	@Override
    	public void expectMethod() {
    		//可以调用Adaptee的方法做适当修改
    		notMatchMethod();
    		System.out.println("在适配器中实现期待的方法");
    	}
    }
    

      

    Adapter与Adaptee是继承关系
    用一个具体的Adapter类和Target进行匹配。结果是当我们想要一个匹配一个类以及所有它的子类时,类Adapter将不能胜任工作
    使得Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子集
    仅仅引入一个对象,并不需要额外的指针以间接取得adaptee

    2.对象适配器模式

    /**
     * 对象适配器模式
     * 通过对象的委托实现
     */
    public class Adapter2 {
    	
    	private Adaptee adaptee;
    	
    	public Adapter2(Adaptee adaptee){
    		this.adaptee=adaptee;
    	}
    	
    	public void notMatchMethod(){
    		//
    		this.adaptee.notMatchMethod();
    	}
    	
    	public void expectMethod(){
    		//需要的接口
    		System.out.println("在适配器中实现期待的方法");
    	}
    
    }
    

      

    Adapter与Adaptee是委托关系
    允许一个Adapter与多个Adaptee同时工作。Adapter也可以一次给所有的Adaptee添加功能
    使用重定义Adaptee的行为比较困难
    无论哪种适配器,宗旨都是:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。
    即在不改变原有系统的基础上,提供新的接口服务。

    适用场景

    使用一个已经存在的类,而它的接口不符合你的需求,
    创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。

  • 相关阅读:
    【Leetcode Top-K问题 BFPRT】第三大的数(414)
    【Leetcode 堆、快速选择、Top-K问题 BFPRT】数组中的第K个最大元素(215)
    BFPRT算法
    对快速排序的分析 Quick Sort
    内部排序算法汇总
    【Leetcode堆和双端队列】滑动窗口最大值(239)
    Python里的堆heapq
    【Leetcode堆】数据流中的第K大元素(703)
    【Leetcode栈】有效的括号(20)
    【Leetcode链表】分隔链表(86)
  • 原文地址:https://www.cnblogs.com/binyue/p/4304679.html
Copyright © 2011-2022 走看看