设计模式-适配器模式

喜欢就点关注吧!

以最简单的module学习设计模式,理解最重要

适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

适配器模式的三个特点:

  • 1、 适配器对象实现原有接口
  • 2、 适配器对象组合一个实现新接口的对象(这个对象也可以不实现一个接口,只是一个单纯的对象)
  • 3、 对适配器原有接口方法的调用被委托给新接口的实例的特定方法

前言

代码实现仓库: https://github.com/AnyMarvel/desigPattern

适配器模式,简言之,即定义一个包装类,用于包装不兼容接口的对象

包装类 = 适配器Adapter; 被包装对象 = 适配者Adaptee = 被适配的类

主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。

何时使用:

  • 1、系统需要使用现有的类,而此类的接口不符合系统的需要。
  • 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
  • 3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)

白话适配器模式

使用电源插座的例子来描述适配器模式,假设以下场景: 场景:国标(国内标准)插座为3个孔,德标准(德国标准)插座为2个孔 问题:一国内游客去德国旅游,拿着国标的充电器(3个孔)如何使用德标的插孔(2个孔) 解决办法:电源转化适配器 UML类图:

定义国标接口

/**
 * 国标接口
 */interface GBSocketInterface {    /**
     * 使用三项扁头的插口供电
     */
    fun powerWithThreeFlat()
}

实现国标接口的中国插座

/**
 * 中国插座
 */class GBSocket : GBSocketInterface {    override fun powerWithThreeFlat() {
        println("使用三项扁头插孔供电")
    }
}

定义德标接口

/**
 * 德标接口
 */interface DBSocketInterface {    /**
     * 使用两项圆头的插口供电
     */
    fun powerWithTwoRound()
}

实现德标接口的德国插座

/**
 * 德国插座
 */class DBSocket : DBSocketInterface {    override fun powerWithTwoRound() {
        println("使用两项圆头的插孔供电")
    }
}

实现德国宾馆,使用德国插座

/**
 * 德国宾馆
 */internal class Hotel {    /**
     * 旅馆中有一个德标的插口
     */

    private var dbSocket: DBSocketInterface? = null

    /**
     * 德国宾馆设置
     *
     * @param dbSocket
     */
    fun setDbSocket(dbSocket: DBSocketInterface) {
        this.dbSocket = dbSocket
    }    /**
     * 旅馆中有一个充电的功能
     */
    fun charge() {        //使用德标插口充电
        dbSocket!!.powerWithTwoRound()
    }
}

创建适配器,适配器需要将国标接口转换为德标接口,必须满足以下条件:

1 必须符合德国标准的接口,否则的话还是没办法插到德国插座中; 2 在调用上面实现的德标接口进行充电时,提供一种机制,将这个调用转到对国标接口的调用 。

这就要求: 1 适配器必须实现原有的旧的接口 2 适配器对象中持有对新接口的引用,当调用旧接口时,将这个调用委托给实现新接口的对象来处理,也就是在适配器对象中组合一个新接口。

/**
 * 适配器实现德标接口
 */class SocketAdapter : DBSocketInterface {    /**
     * 组合新接口
     */
    private var gbSocket: GBSocketInterface    /**
     * 在创建适配器对象时,必须传入一个新接口的实现类
     *
     * @param gbSocket 国标接口
     */
    internal constructor(gbSocket: GBSocketInterface) {        this.gbSocket = gbSocket
    }    /**
     * 将对旧接口的调用适配到新接口
     */
    override fun powerWithTwoRound() {

        gbSocket.powerWithThreeFlat()
    }

}

测试代码:

object AdapterTest {
    @JvmStatic
    fun main(args: Array<String>) {        /**
         * 初始化一个中国插座对象, 用一个国标接口引用它
         */
        val gbSocket = GBSocket()        /**
         * 创建一个旅馆对象
         */
        val hotel = Hotel()        /**
         * 创建适配器,使国标接口适配国标接口
         */
        val socketAdapter = SocketAdapter(gbSocket)        /**
         * 设置插座
         */
        hotel.setDbSocket(socketAdapter)        /**
         * 在旅馆中给手机充电
         */
        hotel.charge()
    }

}

运行结果:

设计模式持续更新中:https://www.jianshu.com/p/e3c25095c31f 持续更新中

原文发布于微信公众号 - Android历练记(gh_db8538619cdd)

原文发表时间:2018-06-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一名叫大蕉的程序员

简约的JAVA版本MapReduce和日常No.25

昨天做了一个小调查,说看看想看些啥。大概的分布是这样的,一个1代表一个投票。看来还是2、3比较多。 11111 希望看到"算法"回复1。 111...

21150
来自专栏十月梦想

node通过路由获取不同用户信息

具体功能:使用不同url判断是老师或者学生,老师的工号4-6位,学生学号8-10位,否则提示学号不正确,

8940
来自专栏腾讯IVWEB团队的专栏

响应式编程中 Stream 对象的实现原理

这篇文章介绍一种编程泛型,叫做响应式编程。将响应式称作“编程泛型”可能有些夸大其作用范畴,不过通过引入响应式确实会改变我们对特定问题的思考方法,就像刚接触red...

58500
来自专栏游戏开发那些事

【Unity游戏开发】Lua中的os.date和os.time函数

  最近马三在工作中经常使用到了lua 中的 os.date( ) 和 os.time( )函数,不过使用的时候都是不得其解,一般都是看项目里面怎么用,然后我就...

21840
来自专栏深度学习之tensorflow实战篇

计算机常用算法对照表整理

常用对照: NLP CRF算法: 中文名称条件随机场算法,外文名称conditional random field algorithm,是一种数学算法,是2...

53950
来自专栏京东技术

京东资深架构师代码评审歪诗

21530
来自专栏沈唁志

使用PHP实现数组的笛卡尔积来处理商品规格

在优化商城项目的时候,选择将商品的内容、规格、库存和价格分三个表来写。将多个规格的id合并存在一个字段中,按照从小到大的顺序来排列,使用逗号分隔

18520
来自专栏Python与爬虫

一行代码蒸发了¥6,447,277,680 人民币!

在他发表完言论没多久,2月美链(BEC)上交易所会暴涨4000%,后又暴跌。尽管他多次否认,聪明的网友早已扒出,他与BEC千丝万缕的关系。

11920
来自专栏偏前端工程师的驿站

JS魔法堂:不完全国际化&本地化手册 之 理論篇

前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求——国际化&本地化。熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"...

25680
来自专栏数据结构与算法

2199. [HZOI 2016] 活动投票

★★   输入文件:hztp.in   输出文件:hztp.out 简单对比 时间限制:0.5 s   内存限制:2 MB 【题目描述】 衡中活动很多,...

33160

扫码关注云+社区

领取腾讯云代金券