23种设计模式之结构型设计模式(2)------适配器模式

本文详细介绍了适配器模式的概念及应用场景,展示了如何通过继承和实现接口的方式完成类与接口之间的适配,并提供了具体的Java代码示例。

一 概述

定义:适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。

属于结构型模式

主要分为三类:类适配器模式、对象的适配器模式、接口的适配器模式。

本文定义:

需要被适配的类、接口、对象(我们有的),简称 src(source) 
最终需要的输出(我们想要的),简称 dst (destination,即Target) 
适配器称之为 Adapter 。

一句话描述适配器模式的感觉: src->Adapter->dst,即src以某种形式(三种形式分别对应三种适配器模式)给到Adapter里,最终转化成了dst。

拿我们Android开发最熟悉的展示列表数据的三大控件:ListView,GridView,RecyclerView的Adapter来说,它们三个控件需要的是View(dst),而我们有的一般是datas(src),所以适配器Adapter就是完成了数据源datas 转化成 ItemView的工作。 
带入src->Adapter->dst中,即datas->Adapter->View.

使用场景:

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


二 类适配器模式:

一句话描述:Adapter类,通过继承 src类,实现 dst 类接口,完成src->dst的适配。

代码案例: 

一.接口的适配器模式

1.定义一个接口

/**
 * CLASSNAME:IOrigin
 * DATE:2018/3/14 22:17
 * 描述1:原有的接口,不符合客户要求
 * 描述2:
 */

 interface IOrigin {
    public void deal();
}

2.定义一个符合客户的新接口

/**
 * CLASSNAME:ITarget
 * DATE:2018/3/14 22:19
 * 描述1:定义一个符合客户要求的新接口
 * 描述2:
 */

public interface ITarget {
    public void newDeal(int type,IOrigin origin);
}
3.创建一个新的具体类,来实现这个接口
/**
 * CLASSNAME:Target
 * DATE:2018/3/14 22:20
 * 描述1:创建一个新的具体类,来实现这个接口
 * 描述2:
 */

public class Target implements ITarget {

    private IOrigin origin;

    @Override
    public void newDeal(int type,IOrigin origin) {
        if (type == 0) {
            origin.deal();//原来的接口调用的方法
        } else {
            //做其他事情
            System.out.println("Usb接口");
        }
    }
}

4.原来接口的实现类

/**
 * CLASSNAME:PristineIOrigin
 * DATE:2018/3/14 22:26
 * 描述1: 原来的接口实现的类
 * 描述2:
 */

public class PristineIOrigin implements IOrigin {

    @Override
    public void deal() {
        System.out.println("圆形接口");
    }
}

5.测试.

/**
 * CLASSNAME:Test
 * DATE:2018/3/14 22:24
 * 描述1:
 * 描述2:
 */

public class Test {

    public static void main(String[] args) {
        Target target = new Target();
        IOrigin  pristineIOrigin = new PristineIOrigin();
        target.newDeal(1,pristineIOrigin);
    }
}

 运行结果:

 传 1的时候: 是  圆形接口.

 传 2的时候, 是   usb接口.


二.类适配器模式

1.

/**
 * CLASSNAME:Voltage380
 * AUTHOR:邓望保 lenovo
 * 邮箱:411085214@qq.com
 * 电话:18665996821
 * DATE:2018/3/14 23:37
 * 描述1: 原来只有380V电压,目前不适合客户用了
 * 描述2:
 */

public class Voltage380 {
    public int output380V() {
        int src = 380;
        System.out.println("我是" + src + "V");
        return src;
    }
}
2.
客户需要的5V电压
public interface Voltage5 {
    int output5V();
}

3.Adapter类:完成380V-5V的转变

public class VoltageAdapter extends Voltage380 implements Voltage5 {
    @Override
    public int output5V() {
        int src = output380V();
        System.out.println("适配器工作开始适配电压");
        int dst = src / 76;
        System.out.println("适配完成后输出电压:" + dst);
        return dst;
    }
}
4.手机 需要5V电压

public class Mobile {
    /**
     * 充电方法
     *
     * @param voltage5
     */
    public void charging(Voltage5 voltage5) {
        if (voltage5.output5V() == 5) {
            System.out.println("电压为5V,开始充电");
        } else if (voltage5.output5V() > 5) {
            System.out.println("电压超过5V,断开连接 ");
        }
    }
}

5.测试.

public class Test {

    public static void main(String[] args) {
//        Target target = new Target();
//        IOrigin  pristineIOrigin = new PristineIOrigin();
//        target.newDeal(1,pristineIOrigin);
        System.out.println("===============类适配器==============");
        Mobile mobile = new Mobile();
        mobile.charging(new VoltageAdapter());
    }
}

运行结果:

===============类适配器==============
我是380V
适配器工作开始适配电压
适配完成后输出电压:5
电压为5V,开始充电


参考自:http://blog.youkuaiyun.com/zxt0601/article/details/52848004 博客.

适配器模式在Android中用用到,大家可以了解下!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值