zoukankan      html  css  js  c++  java
  • 适配器模式

    首先,先来先讲讲适配器。适配就是由“源”到“目标”的适配,而当中链接两者的关系就是适配器。它负责把“源”过度到“目标”。

    举个简单的例子,比如有一个“源”是一个对象人,他拥有2种技能分别是说日语和说英语,而某个岗位(目标)需要你同时回说日语、英语、和法语,好了,现在我们的任务就是要将人这个“源”适配的这个岗位中,如何适配呢?显而易见地我们需要为人添加一个说法语的方法,这样才能满足目标的需要。

     

    接着讨论如何加说法语这个方法,也许你会说,为什么不直接在“源”中直接添加方法,我的理解是,适配是为了实现某种目的而为一个源类暂时性的加上某种方法,所以不能破坏原类的结构。同时不这么做也符合Java的高内聚,低耦合的原理。既然不能直接加,接着我们就来说该怎么来实现为人这个“源”添加一个方法,而又不破坏“源”的本身结构。

     

    适配器模式有2种,第一种是“面向类的适配器模式”,第二种是“面向对象的适配器模式”。

    ==============================================================================================================

    面向类的适配器

    顾名思义,这类适配器模式就是主要用于,单一的为某个类而实现适配的这样一种模式,为什么说只为某个类去实现,一会提到,我们先展示这种类适配模式的代码实现。

     

    源的代码如下:

    [c-sharp] view plaincopy
    1. // 源
    2. public class Person {  
    3.       
    4.     private String name;  
    5.     private String sex;  
    6.     private int age;  
    7.       
    8.     public void speakJapanese(){  
    9.         System.out.println("I can speak Japanese!");  
    10.     }  
    11.       
    12.     public void speakEnglish(){  
    13.         System.out.println("I can speak English!");  
    14.     }  
    15.     ...//以下省略成员变量的get和set方法  
    16. }  

     

     目标接口的代码如下:

    [c-sharp] view plaincopy
    1. //目标
    2. public interface Job {  
    3.       
    4.     public abstract void speakJapanese();  
    5.     public abstract void speakEnglish();  
    6.     public abstract void speakFrench();  
    7.       
    8. }  

     适配器的代码如下:

    [c-sharp] view plaincopy
    1. //适配器,把 源 过度到 目标
    2. public class Adapter extends Person implements Job{  
    3.   
    4.     public void speakFrench() {  
    5.           
    6.     }  
    7.       
    8. }  

     

    好了,代码看完然后要做一些说明了,之前遗留的一个问题,为什么称其为类适配模式呢?很显然的,Adapter类继承了Person类,而在Java这种单继承的语言中也就意味着,他不可能再去继承其他的类了,这样也就是这个适配器只为Person这一个类服务。所以称其为类适配模式。

     

    ==============================================================================================================

    面向对象的适配器

    说完类的适配模式,我们要开始说第2种对象的适配器模式了。对象适配器模式是把“源”作为一个对象聚合到适配器类中。同样的话不多说,贴上代码:

    源的代码如下:

    [c-sharp] view plaincopy
    1. // 源
    2. public class Person {  
    3.       
    4.     private String name;  
    5.     private String sex;  
    6.     private int age;  
    7.       
    8.     public void speakJapanese(){  
    9.         System.out.println("I can speak Japanese!");  
    10.     }  
    11.       
    12.     public void speakEnglish(){  
    13.         System.out.println("I can speak English!");  
    14.     }  
    15.     ...//以下省略成员变量的get和set方法  
    16. }  

     

     目标接口的代码如下:

    [c-sharp] view plaincopy
    1. //目标
    2. public interface Job {  
    3.       
    4.     public abstract void speakJapanese();  
    5.     public abstract void speakEnglish();  
    6.     public abstract void speakFrench();  
    7.       
    8. }  

    [c-sharp] view plaincopy
    1. //适配器
    2. public class Adapter implements Job {  
    3.   
    4.     Person person;  
    5.   
    6.     public Adapter(Person person) {  
    7.         this.person = person;  
    8.     }  
    9.   
    10.     public void speakEnglish() {  
    11.         person.speakEnglish();  
    12.     }  
    13.   
    14.     public void speakJapanese() {  
    15.         person.speakJapanese();  
    16.     }  
    17.   
    18.     //new add  
    19.     public void speakFrench() {  
    20.           
    21.     }  
    22.   
    23. }  

     

    对象的适配器模式,把“源”作为一个构造参数传入适配器,然后执行接口所要求的方法。这种适配模式可以为多个源进行适配。弥补了类适配模式的不足。

     

    现在来对2种适配模式做个分析:

    1.类的适配模式用于单一源的适配,由于它的源的单一话,代码实现不用写选择逻辑,很清晰;

    而对象的适配模式则可用于多源的适配,弥补了类适配模式的不足,使得原本用类适配模式需要写很多适配器的情况不复存在,弱点是,由于源的数目可以较多,所以具体的实现条件选择分支比较多,不太清晰。

    2.适配器模式主要用于几种情况:

    (1)系统需要使用现有的类,但现有的类不完全符合需要。

    (2)讲彼此没有太大关联的类引进来一起完成某项工作(指对象适配)。

     

    ==============================================================================================================

    默认适配器


    最后,再来顺带谈谈默认适配器模式:

    这种模式的核心归结如下:

    当你想实现一个接口但又不想实现所有接口方法,只想去实现一部分方法时,就用中默认的适配器模式,他的方法是在接口和具体实现类中添加一个抽象类,而用抽象类去空实现目标接口的所有方法。而具体的实现类只需要覆盖其需要完成的方法即可。代码如下:

    接口类:

    [c-sharp] view plaincopy
    1. public interface Job {  
    2.       
    3.     public abstract void speakJapanese();  
    4.     public abstract void speakEnglish();  
    5.     public abstract void speakFrench();  
    6.     public abstract void speakChinese();  
    7.       
    8. }  

    抽象类:

    该抽象类实现接口中的所有方法 

    [c-sharp] view plaincopy
    1. public abstract class JobDefault implements Job{  
    2.   
    3.     public void speakChinese() {  
    4.           
    5.     }  
    6.   
    7.     public void speakEnglish() {  
    8.           
    9.     }  
    10.   
    11.     public void speakFrench() {  
    12.           
    13.     }  
    14.   
    15.     public void speakJapanese() {  
    16.           
    17.     }  
    18.   
    19. }  

    实现类:

    JobImpl想实现Job接口,但是又不想实现Job接口中的所有方法,又抽象类JobDefault来实现Job接口中的所有方法,

    JobImpl覆盖抽象类JobDefault中的某一方法即可

    [c-sharp] view plaincopy
    1. public class JobImpl extends JobDefault{  
    2.       
    3.     public void speakChinese(){  
    4.         System.out.println("I can speak Chinese!");  
    5.     }  
    6.       
    7. }  


  • 相关阅读:
    Service Name Port Number Transport Protocol tcp udp 端口号16bit
    linux linux 互传文件 win 不通过 ftp sftp 往linux 传文件(文件夹)
    soft deletion Google SRE 保障数据完整性的手段
    Taylor series
    Taylor's theorem
    Moving average
    REQUEST
    Unix file types
    mysqld.sock
    Tunneling protocol
  • 原文地址:https://www.cnblogs.com/baoendemao/p/3804657.html
Copyright © 2011-2022 走看看