《Android源码设计模式解析与实战》读书笔记(二十)
来源:互联网 发布:ubuntu共享文件夹 编辑:程序博客网 时间:2024/06/06 18:33
第二十章、适配器模式
适配器模式是结构型设计模式之一,它在我们的开发中使用率极高,比如ListView、GridView以及RecyclerView都需要使用Adapter。
1.定义
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配无法在一起工作的两个类可以在一起工作。
2.使用场景
(1)系统需要使用现有的类,但此类的接口不符合系统的需要,即接口不兼容。
(2)想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
(3)需要一个统一的输出接口,而输入端的类型不可预知。
3.UML类图
适配器模式分为两种,即类适配器模式与对象适配器模式。以下是类适配器的UML图。
(1)Target
:目标角色,也就是所期待得到的接口。注意:由于这里讨论的是类适配器模式,因此目标不可以是类。
(2)Adaptee
:现在需要适配的接口。
(3)Adapter
:适配器角色,也就是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类。
4.简单实现
以笔记本电源适配器为例,电源适配器将220V的电压转换到5V。那么5V电压就是Target接口,220V电压就是Adaptee类,转换就是Adapter。
(1)以类适配器模式实现
//Target角色public interface FiveVolt { public int getVolt5();}
//Adapter角色public class Volt220 { public int getVolt220(){ return 220; }}
public class VoltAdapter extends Volt220 implements FiveVolt{ @Override public int getVolt5() { return 5; }}
public class Test { public static void main(String[] args) { VoltAdapter adapter = new VoltAdapter(); System.out.println("输出电压:" + adapter.getVolt5()); }}
结果:
输出电压:5
(2)对象适配器模式实现
对象适配器模式与类适配器模式不同的是,对象适配器模式不是使用继承关系连接到Adapter类,而是使用代理关系连接到Adapter类。
所以FiveVolt 、Volt220 不变,VoltAdapter 修改如下:
public class VoltAdapter1 implements FiveVolt{ Volt220 mVolt220; public VoltAdapter1(Volt220 adaptee) { this.mVolt220 = adaptee; } public int getVolt220(){ return mVolt220.getVolt220(); } @Override public int getVolt5() { return 5; }}
Test修改为:
public class Test { public static void main(String[] args) { VoltAdapter adapter = new VoltAdapter(new Volt220()); System.out.println("输出电压:" + adapter.getVolt5()); }}
这种实现方式直接将要适配的对象传递到Adapter中,使用组合的形式实现接口兼容的效果。这比类适配器方式更为灵活,同时被适配对象的方法不会暴露出来。因此对象适配器模式更加灵活、实用。
5.Android源码中的适配器模式
1.ListView的Adapter
这里ListView的Adapter就是使用的对象适配器模式,Target就是View,Adapter角色就是将Item View输出为View抽象的角色,Adaptee就是需要被处理的Item View。
6.总结
1.优点
(1)更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
(2)更好的扩展性:在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
2.缺点
过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
7.参考
《JAVA与模式》之适配器模式
- 《Android源码设计模式解析与实战》读书笔记(十)
- 《Android源码设计模式解析与实战》读书笔记(十)
- 《Android源码设计模式解析与实战》读书笔记(二十)——适配器模式
- 《Android源码设计模式解析与实战》读书笔记(二十)
- 《Android源码设计模式解析与实战》读书笔记(二)
- 《Android源码设计模式解析与实战》读书笔记(十)——解释器模式
- 《Android源码设计模式解析与实战》读书笔记(二)——单例模式
- 《Android源码设计模式解析与实战》读书笔记(二十一)——装饰者模式
- 《Android源码设计模式解析与实战》读书笔记(二十二)——享元模式
- 《Android源码设计模式解析与实战》读书笔记(二十三)——外观模式
- 《Android源码设计模式解析与实战》读书笔记(二十四)——桥接模式
- 【读书笔记】Android源码设计模式解析与实战(二)——单例模式
- 《Android源码设计模式解析与实战》读书笔记(一)
- 《Android源码设计模式解析与实战》读书笔记(三)
- 《Android源码设计模式解析与实战》读书笔记(四)
- 《Android源码设计模式解析与实战》读书笔记(五)
- 《Android源码设计模式解析与实战》读书笔记(六)
- 《Android源码设计模式解析与实战》读书笔记(七)
- javascript中的比较
- Java SE 学习笔记 chapter2
- UIsearchController
- opencv-图像增强
- 《纸牌屋》是如何成为热播剧的?
- 《Android源码设计模式解析与实战》读书笔记(二十)
- ios9.0.2无需验证降级8.4.1详细教程
- NSPredicate的用法
- 深度学习、机器学习、模式识别之间的联系和区别 Deep Learning vs Machine Learning vs Pattern Recognition
- 使用tftp时出现 tftp:timeout
- 四大组件之Service
- OC_runtime运行时官方文档翻译
- excel中计算值
- [转]正则表达式30分钟入门教程(正则小白的圣经)