Android(安卓)内功心法(1.6)——android常用设计模式之适配器模式
基本概念:
将一个类的接口转换成程序需要的另一个接口。adapter 使得原本由于接口不兼容而不能一起工作的那些类一起工作。
适配器模式有两种,类适配器和对象适配器
使用场景:
想要使用一个已经存在的类,它的方法或者所做的事情基本相同的时候就可以考虑使用适配器模式。当然,前提是这两个类都不太容易修改的时候使用。
使用目的:
当两段十分相似的逻辑无法合并的时候就需要使用适配器模式来让相同的接口下适配不同的方法结构。说到底就是为了减少程序接口,统一接口方法的一种优化方法。
/** * 适配器的对外接口 */public abstract class Targets { //记录球员的名字 protected String name; public Targets(String name) { this.name = name; } //球员有两个职责,一个是进攻,一个是防守 public abstract void getAttack();//进攻 public abstract void getGuard();//防守}
所有需要使用到具体类的逻辑都只能调用抽象类中的方法
/** * 普通类,可以直接适配适配器类对外的接口 */public class Normal extends Targets { public Normal(String name) { super(name); } @Override public void getAttack() { //具体逻辑 Log.e("test", "进攻"); } @Override public void getGuard() { //具体逻辑 Log.e("test", "防守"); }}
对于继承了抽象类的普通类,调用其接口没有问题
/** * 特殊类,不可以直接适配适配器类对外的接口 */public class Special { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void getAttackAdapter() { //具体逻辑 Log.e("test", "进攻"); } public void getGuardAdapter() { //具体逻辑 Log.e("test", "防守"); }}
这是个特殊类,也需要调用抽象类(Targets)中的接口。
怎么做呢?这时候就有了适配器类
/** * 特殊类的适配器,使其能够适配Targets的对外接口 */public class Adapter extends Targets { //在其内部实例化一个特殊类 private Special special; public Adapter(String name) { super(name); special = new Special(); special.setName(name); } @Override public void getAttack() { //调用对外接口的时候实际上执行的是特殊类的接口 special.getAttackAdapter(); } @Override public void getGuard() { //调用对外接口的时候实际上执行的是特殊类的接口 special.getGuardAdapter(); }}
这样,当Special 类需要使用Targets 中的接口的时候,就可以用adapter类去代理special类去做处理。
运行方式:
private void test() { //实例化一个普通类,符合对外接口的类 Normal normal = new Normal("库里"); normal.getAttack();//库里进攻 //实例化一个特殊类,姚明听不懂英语,就需要适配器去处理中文(getAttackAdapter()) Adapter special = new Adapter("姚明"); special.getGuard();//姚明防守 }
其中,姚明因为不懂英语,所以它不知道getAttack()和getGuard()的意思是让它做什么。
这时候就需要一个翻译(adapter),要求姚明调用英文(getGuard())的时候,翻译(adapter)就将这句英语处理,说给姚明的就变成了中文(getGuardAdapter());
这样,即使姚明(Special)不懂英文(Targets),有了翻译(Adapter),姚明也可以正常的交流(逻辑处理)了。
这就是适配器的作用。
当一个类实在是无法改变数据接口或者接口方法的时候就能够选择适配器模式来满足需求。
就像android框架设计的时候,水平稍弱的程序前期设计的时候考虑不周全,后期发现代码冗余但是逻辑复杂无法修改的时候,就可以选择适配器模式来优化。
换句话说,适配器模式就是在病入膏肓的时候的一剂猛药。
前期的精心设计就像是疾病的预防,后期无法通过预防(修改)来达到目的的时候就需要猛药(适配器)来处理了。
更多相关文章
- Android:微信授权登录与微信分享全解析
- 基于Android的小巫新闻客户端开发---显示新闻详细内容业务逻辑实
- 解决android程序中oncreate方法中调用百度地图MKSearchListener
- [置顶] Android(安卓)使用Mockito测试业务逻辑
- Android适配器进阶之三(抽象分类适配器)
- Android(安卓)App整体架构设计的思考(一)
- Android第五十一期 - 即时通讯视频聊天
- android回调的理解------异步任务回调接口
- Android适配器总结