美文网首页程序员
设计模式-适配器模式

设计模式-适配器模式

作者: KevinLive | 来源:发表于2017-06-15 19:47 被阅读36次

原文地址:LoveDev

适配器模式(Adapter Pattern):将一个接口转换成调用者希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装类(Wrapper),该模式可以作为类结构型模式,也可以作为对象结构型模式

适配器模式应该是 Android 开发当中最常见的几个设计模式之一了,各种各样的列表(ListView,GridView,RecyclerView)都要使用一个 Adapter 的类

使用场景:

  • 系统需要使用现有的类,而这些类的接口不符合系统的需要
  • 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作

适配器模式一个可以分为三个适配器:

<h1 id="CLASS"> 类适配器 </h1>

类适配器类适配器
  • Target:目标角色,可以是一个抽象类或接口,由于是类适配器,不能为具体类
  • Adaptee:适配者类,一般是一个具体类,包含期望的业务方法,某些情况下可能没有适配者的源代码
  • Adapter:适配器类,可以把源接口转换成目标接口
AppleApple

使用 Mac 的同学应该很熟悉上面的两个东西,Apple 的充电器可以把两脚的充电头拔掉换成一个更长且是三脚的充电头,下面就以这两个东西为示例,完成一个适配器模式,示例代码:

Target 类:

public interface Power {
    /**
     * 充电
     */
    void charge();
}

在正常情况下用两脚的插头已经足够满足需求了,但是现在所处的环境只有三脚的插板,现在就可以把只支持三脚的插板看做是现有的接口,而默认的充电是不支持此接口的,这时候就需要用到三脚的适配器,示例代码:

Adaptee 类,期望实现的功能:

public class ExtensionPower {

    public void specificPower() {
        LogUtils.i("用三脚,1.8米延长线充电");
    }
}

Adapter 类,三脚延长线:

public class PowerAdapter extends ExtensionPower implements Power{

    @Override
    public void charge() {
        super.specificPower();
    }
}

Client 类:

public class Client {
    PowerAdapter powerAdapter = new PowerAdapter();
    powerAdapter.charge();
}

利用适配器模式就可以解决上述的问题,并且非常符合开闭原则

<h1 id="OBJECT"> 对象适配器 </h1>

对象适配器对象适配器

对象适配器不在使用类适配器继承再实现的方式,而是采用直接关联的方式,区别就在于 adapter 类:

public class PowerAdapter implements Power {

    private ExtensionPower extensionPower;

    // 此处改为直接关联的方式
    public PowerAdapter(ExtensionPower extensionPower) {
        this.extensionPower = extensionPower;
    }

    @Override
    public void charge() {
        this.extensionPower.specificPower();
    }
}

<h1 id="DEFAULT"> 缺省适配器 </h1>

缺省适配器缺省适配器

当我们只想实现一个接口 N 多个方法中的一个时,就要用到该模式了,在具体实现类和接口中间设计一个抽象类实现该接口,并提供所有方法的空实现,具体实现类就可以继承抽象类,这样就可以选择自己想要实现的某一接口

举个栗子:一个已婚人士的生活是吃饭,睡觉以及啪啪啪,但是现在需要需要添加一个新的物种叫做单身狗,单身狗当然是没有啪啪啪功能的,这个时候就需要创建一个抽象类实现已婚人士这个接口,并让单身狗继承实现吃饭和睡觉的功能

示例代码:

已婚人士接口:

public interface MarriedPeople {

    /**
     * 吃饭
     */
    void eat();

    /**
     * 睡觉
     */
    void sleep();


    /**
     * 啪啪啪
     */
    void papapa();
}

抽象类:

public abstract class Adults implements MarriedPeople {
    @Override
    public void eat() {

    }

    @Override
    public void sleep() {

    }

    @Override
    public void papapa() {

    }
}

单身狗:

public class SingleDog extends Adults {

    public void eat() {
        LogUtils.i("吃饭");
    }

    public void sleep() {
        LogUtils.i("睡觉");
    }
}

说了这么多,该到总结的时候了,适配器模式优点:

  • 使用适配器类达到重用先用适配者类,无须修改原有结构
  • 增加类的透明性和复用性,具体业务逻辑都封装在适配者类中,提高适配者的复用性

相关文章

  • 简说设计模式之适配器模式

    前言:对于设计模式基础概念可以去看[简说设计模式之设计模式概述] 一、什么是适配器模式 适配器模式(Adapter...

  • 设计模式 - 目录

    设计模式01 - 单例模式 设计模式02 - 工厂模式 设计模式03 - 建造者模式 设计模式04 - 适配器模式...

  • 最常用的设计模式---适配器模式(C++实现)

    适配器模式属于结构型的设计模式,它是结构型设计模式之首(用的最多的结构型设计模式)。 适配器设计模式也并不复杂,适...

  • iOS设计模式(5)策略模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器...

  • iOS设计模式(6)模板模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器...

  • iOS设计模式(7)建造者模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器...

  • iOS设计模式(4)抽象工厂模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器...

  • iOS设计模式(1)简单工厂模式

    设计模式系列文章 《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器模式》《iOS设计模式(4)抽象工厂...

  • iOS设计模式(2)工厂模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(3)适配器模式》《iOS设计模式(4)抽象...

  • iOS设计模式(8)外观模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器...

网友评论

    本文标题:设计模式-适配器模式

    本文链接:https://www.haomeiwen.com/subject/dnpuqxtx.html