您的位置:首页 > 移动开发 > Android开发

《Android源码设计模式解析与实战》读书笔记(二十)——适配器模式

2017-06-05 18:09 323 查看
适配器,我们在 Android 开发中使用得太多了,什么 ListView 的适配器、 RecycylerView 的适配器、ViewPager 的适配器等等等等,这些适配器的原理就是适配器模式。它是将两个不兼容的类融合在一起,让它们可以相互协作,就像一个粘合剂。如果没有适配器的话,要想让两个没有关系的类相互交互,只能去修改各自类的接口,但是这样就违背了开闭原则,适配器可以让我们在不修改源代码的情况下满足我们的需求。

第二十章 得心应手的“粘合剂”——适配器模式

1.定义

把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而不能在一起工作的两个类能够在一起工作。

2.使用场景

1).程序需要使用现有的类,而此类的接口不符合程序的需求,即接口不兼容。

2).想要建立一个可以重复使用的类,用于与一些彼此间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

3).需要一个统一的输出接口,而输入端的类型不可预知。

3.简单实现

很常见的一个情景,一般的家庭用电都是 220V,但是我们手机充电一般需要 5V 的电压,手机充电器其实就是一个变压器,也就是适配器,将原本 220 V的电压适配成手机需要的 5V。

那么定义一个电源适配器:

public interface PowerAdapter {
int transform();
}


家庭用电电源:

public class Power {
public int getPower() {
return 220;
}
}


手机类:
public class Phone {
private PowerAdapter mPowerAdapter;

public void setmPowerAdapter(PowerAdapter mPowerAdapter) {
this.mPowerAdapter = mPowerAdapter;
}

public int charge() {
int transformVoltage = mPowerAdapter.transform();
System.out.println("手机充电时的电压:" + transformVoltage + "V");
return transformVoltage;
}
}


电源适配器:
public class PhonePowerAdapter implements PowerAdapter {
private Power mPower;

public PhonePowerAdapter(Power power) {
this.mPower = power;
}

@Override
public int transform() {
int voltage = mPower.getPower();
System.out.println("电源提供的电压:" + voltage+"V");
int phoneVoltage = voltage / 44;
System.out.println("手机充电需要的电压:" + phoneVoltage+"V");
return phoneVoltage;
}
}


客户端(MainActivity)调用:

Phone mPhone = new Phone();
Power mPower = new Power();
PhonePowerAdapter mPhonePowerAdapter = new PhonePowerAdapter(mPower);
mPhone.setmPowerAdapter(mPhonePowerAdapter);
mPhone.charge();


是不是有点 ListView 设置适配器的影子。运行程序,打印如下:



为手机设置了一个适配器,就将原本不兼容的电压给转换成了可以使用的电压。

4.总结

其实适配器模式更多的是用在数据和 UI 控件绑定的时候,上面只是个小示例,描述了适配器模式的简单意义和基本结构,我会写一个自定义控件来应用一下。适配器模式在 Android 开发中非常广泛,所以掌握它是非常重要的。

优点:

1).更好的复用性。程序需要使用现有的类,而此类的接口不符合程序的需要,那么可以通过适配器让这些功能得到更好的复用。

2).更好的扩展性,在实现适配器功能时,可以调用自己开发的功能,也就扩展了程序的功能。

缺点:

1).过多地使用适配器会使程序看起来很零乱,不易把握。

Demo下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: