一 概述
定义:适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(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中用用到,大家可以了解下!