zoukankan      html  css  js  c++  java
  • 亲身实践,JAVA最优良的Adapter模式适配器模式

    网上关于JAVA的适配器模式例子有很多,但真的有少实在不怎么样,看也不懂。自己总结了一个在性能和结构上都很容易理解的Adapter模式。



    Adapter模式也叫适配器模式,是由GoF提出的23种设计模式的一种。Adapter模式是构造型模式之一,通过Adapter模式,可以改变已有类(或外部类)的接口形式。

    在大规模的系统开发过程中,我们常常碰到诸如以下这些情况:
    我们需要实现某些功能,这些功能已有还不太成熟的一个或多个外部组件,如果我们自己重新开发这些功能会花费大量时间;所以很多情况下会选择先暂时使用外部组件,以后再考虑随时替换。但这样一来,会带来一个问题,随着对外部组件库的替换,可能需要对引用该外部组件的源代码进行大面积的修改,因此也极可能引入新的问题等等。如何最大限度的降低修改面呢?
    Adapter模式就是针对这种类似需求而提出来的。

    Adapter模式通过定义一个新的接口(对要实现的功能加以抽象),和一个实现该接口的Adapter(适配器)类来透明地调用外部组件。这样替换外部组件时,最多只要修改几个Adapter类就可以了,其他源代码都不会受到影响。


    实现Adapter模式的2种方法与范例
    Adapter模式通过在Adapter类中调用外部组件来实现功能。
    根据调用方式的不同,Adapter模式有2种实现方法:
    1,通过继承实现Adapter


    2,通过委让实现Adapter


    为了能更清楚地说明2种实现方法的区别,我们举例说明:
    比如,我们需要实现一个发送邮件的功能,需要用到一个名为OutMailer的外部组件,因为上述原因,我们决定用Adapter模式实现对OutMailer的透明调用。
    首先,我们把邮件发送的功能抽象成一个接口:

    IMailer.java
    interface IMailer {
        
    //发送邮件
        publicvoid sendMail();
    }


    然后定一个实现IMailer接口的MailerAdapter类。

    下面我们来看看MailerAdapter的实现方法。

    通过继承实现Adapter
    MailerAdapter.java
    class MailerAdapterextends OutMailerimplements IMailer {
        
    //发送邮件
        publicvoid sendMail() {
            
    //调用OutMailer.sendMail()方法实现邮件发送
            this.sendMail();
        }

        
    //这里省略其他方法
    }


    通过委让实现Adapter
    MailerAdapter.java
    class MailerAdapterimplements IMailer {
        
    private OutMailer outMailer =new OutMailer();
        
    //发送邮件
        publicvoid sendMail() {
            
    //调用OutMailer.sendMail()方法实现邮件发送
            outMailer.sendMail();
        }

        
    //这里省略其他方法
    }



    不管是通过继承实现Adapter,还是通过委让实现Adapter,调用方MailerClient的调用方法完全一样,如下:
    MailerClient.java
    IMailer mailer =new MailerAdapter();
    ...
    mailer.sendMail();

    我们可以看到,这里完全没有直接调用OutMailer,也就是说OutMailer即使被替换了,我们也不用对MailerClient做任何修改。
  • 相关阅读:
    172. Factorial Trailing Zeroes
    96. Unique Binary Search Trees
    95. Unique Binary Search Trees II
    91. Decode Ways
    LeetCode 328 奇偶链表
    LeetCode 72 编辑距离
    LeetCode 226 翻转二叉树
    LeetCode 79单词搜索
    LeetCode 198 打家劫舍
    LeetCode 504 七进制数
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314570.html
Copyright © 2011-2022 走看看