文档章节

设计模式(五)适配器模式

 小鲜肉成长记
发布于 2017/07/21 09:49
字数 937
阅读 3
收藏 0

概念

适配器模式是指将一个接口转换为客户希望的另外一个接口,该模式使得原本不兼容的类可以一起工作。实现了由“源”到“目标”的适配,适配器负责把“源”过度到“目标”。

模式结构

例如Apple手机Android手机的充电器接口不兼容,在专卖店购买苹果手机时一般都会带一个充电器转换头,一个小小的插头,链接在安卓手机充电器端就可以为苹果手机充电。这里包含几种设备也就是对应适配器模式结构中的几种桔角色。

  • 源角色(Adeptee 安卓手机充电器):需要被适配的接口
  • 目标抽象角色(Target 苹果充电器接口):客户所期待要使用的接口
  • 适配器(Adepter 转换器):将安卓手机充电器接口转换为苹果手机充电器接口,即把源接口转换成符合要求的目标接口(即可以为苹果充电还保留了给安卓充电的功能)
  • 客户端(Client 苹果手机):使用目标角色的设备

两种适配器模式

类适配器模式

这种适配器模式就是主要用于单一的为某个类而实现适配器的一种模式。

示例代码

/**
 * 客户端
 */
public class AdpterClient {
    public static void main(String[] args){
        AppleCharger target = new Adapter();
        target.chargeForApple();
        target.chargeForAndroid();
    }
}

/**
 * 源-Adaptee
 */
class AndroidCharger{
    public void chargeForAndroid(){
        System.out.println("为Android手机充电");
    }
}

/**
 * 目标-Target
 */
interface AppleCharger{
    void chargeForAndroid();
    void chargeForApple();
}

/**
 * 适配器-Adapter
 */
class Adapter extends AndroidCharger implements AppleCharger{
    @Override
    public void chargeForApple() {
        System.out.println("为Apple手机充电");
    }
}
输出结果:

为Apple手机充电
为Android手机充电

也许会有人问为什么不直接在“源”中添加方法?其实适配器是为了实现某种目的而为源类暂时性的添加某种功能方法,所以不能直接改变原结构。再说,这也不符合Java高内聚低耦合的要求。适配器Adapter类继承了AndroidCharder类,Java属于单继承语言,所以Adapter不能再继承其他类了,这样适配器就只为AndroidCharger这一个类服务,所以称为类适配器。

对象适配器模式

对象适配器是把“源”作为一个对象聚合到适配器类中。

例如上例中适配器代码如下

class Adapter1 implements AppleCharger{
    AndroidCharger androidCharger = new AndroidCharger();

    public Adapter1(AndroidCharger androidCharger) {
        this.androidCharger = androidCharger;
    }

    @Override
    public void chargeForAndroid() {
        androidCharger.chargeForAndroid();
    }

    @Override
    public void chargeForApple() {//新增方法
        System.out.println("为Apple手机充电");
    }

    //如果技术能实现我还以为电脑充电,即实现了为多个源进行适配的功能
}
客户端改为

public class AdpterClient {
    public static void main(String[] args){
        AppleCharger target = new Adapter1(new AndroidCharger());
        target.chargeForApple();
        target.chargeForAndroid();
    }
}
运行结果:同上

两种适配器模式总结

  • 类的适配器用于单一源的适配,源的单一化决定代码实现不用写逻辑选择,结构清晰
  • 对象适配器可以用于多源的适配,弥补了类适配器的不足,但同时增加了实现代码的逻辑选择复杂度,结构不太清晰
  • 默认适配器我们想实现一个接口,但不想实现接口的所有方法,只想实现部分时用默认适配器,在接口和具体实现类之间添加一个抽象类,用抽象类去实现目标接口的所有方法,而具体的实现类继承抽象类,只需要覆盖其需要完成的部分方法即可。

默认适配器示例

interface Code{
    void codeJava();
    void codeC();
    void codePhp();
}
abstract class CodeDefault implements Code{
    public void codeC() {
    }
    public void codeJava() {
    }
    public void codePhp() {
    }
}

class CodeImpl extends CodeDefault{
    @Override
    public void codeJava() {
        System.out.println("我只会用Java语言写代码");
    }
}

© 著作权归作者所有

粉丝 0
博文 12
码字总数 14860
作品 0
东城
私信 提问
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
285
2
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.5K
69
EasyToLearnDesignPattern

简单上手设计模式 GITHUB:https://github.com/Fisher-Joe/EasyToLearnDesignPattern 本文旨在使用最简单的语言,最简单的代码让人学习设计模式(最起码是我) 说明: 本文的所有内容都是基于...

芝麻开门
04/19
0
0
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
185
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
8
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
9
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
7
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部