目录
前言
适配器模式是比较常见的,Android开发中也是比较常用的。记录一下相关知识,方便自己后续查阅和回顾。
正文
适配器模式
适配器模式是一种结构型设计模式,用于将一种接口转换为客户端期望的另一个接口,使得原本因接口不兼容而无法一起工作的类可以协同工作。
适配器为中间者,连接着两个互不相容的接口,从而实现接口的适配。
核心思想:在不改变现有代码的情况下,将一个类的接口转换为客户端期望的接口。
作用
接口转换,将原有的接口(或方法)转换成另一个接口进行适配。
优缺点
优点
提高类的复用
灵活性好,不会破坏原有的接口
转换接口,可以让两个没关联的类一起运行
缺点
若过度适配,可能造成代码结构混乱
主要角色
目标接口(Target):定义客户端使用的相关接口
适配者类(Adaptee):一个已经存在的类,但与目标接口存在不兼容的,需要适配
适配器类(Adapter):通过包装适配者类对象,把接口转换成目标接口。
实现方式
类适配器
基于继承。
通过继承
需要适配的类,并实现目标接口。(多用于单继承语言,例如Java)
对象适配器
基于组合。
通过组合
一个需要适配的类的实例,并实现目标接口。(推荐使用,灵活性更高)
demo
本案例为参考文3的,那篇文章写得不错,引用了,感谢。
场景为:插头适配器,你目前只有两孔插头
的电源插座,但新买的冰箱为三孔插头
,需要买一个适配器进行适配。
三孔插头是无法插入两孔的插座的,因此需要买一个适配器,然后进行转换为三孔的插座。
适配器有三个角色,那么上面的分为:
目标接口:两孔插座 ↑ 适配器: ??? ↓ 适配者类:三孔插头
目前就缺少一个适配器。
类图
类适配
基于继承的类适配的类图
对象适配
基于组合的对象适配的类图
代码片段
虽然适配器的实现分两种,一种是基于继承的的类适配,一种是基于组合的对象适配。
目标接口
两孔插座
public interface TwoPinPlug { void connect(); }
适配者
三孔插头接口
public interface ThreePinPlug { void connectWithThreePins(); }
三孔插头实现类
public class ThreePinPlugImpl implements ThreePinPlug{ @Override public void connectWithThreePins() { Log.d(TAG, "connectWithThreePins: "); } }
适配器
根据上面实现适配器分两种,类适配和对象适配。
类适配
//类适配是基于组合方式 public class PlugAdapter extends ThreePinPlugImpl implements TwoPinPlug { @Override public void connect() { // 转换三孔插头的接口为两孔插头接口 super.connectWithThreePins(); } }
客户端调用
//使用类适配器 TwoPinPlug twoPinPlug = new PlugAdapter(); twoPinPlug.connect();
对象适配
public class PlugAdapter2 implements TwoPinPlug { private final ThreePinPlug threePinPlug; public PlugAdapter2(ThreePinPlug threePinPlug) { this.threePinPlug = threePinPlug; } @Override public void connect() { threePinPlug.connectWithThreePins(); } }
客户端调用
//使用对象适配器 TwoPinPlug twoPinPlug1 = new PlugAdapter2(new ThreePinPlugImpl()); twoPinPlug1.connect();
课外知识
BaseAdapter
基础数据适配器,它的主要用途是将一组数据传到例如ListView等UI显示组件,继承自接口类Adapter
SimpleAdapter
简单适配器,系统自定义了一些方法,可以重写这些方法。
ArrayAdapter
数据和UI一对一,传入数据源和布局文件,完成显示。
SimpleCursorAdapter
指向性适配器,指向数据库,可以方便地把数据库的内容以列表的形式展示出来。
参考文章
《》
《》
《》
《