适配器模式(Adapter Pattern),此模式的作用就是兼容原本接口不匹配的两个类,起到桥梁的作用。
其实在Android
中平常接触的就很多,ListView
和GridView
到RecyclerView
都用到的Adapter
就用到了适配器模式,无论给Adapter
什么样的数据,最后到RecyclerView
显示的都是View
。
类适配器模式
类的适配器模式,采用继承实现的
适配器模式.png- Target:目标接口,也就是期望得到的接口
- Adaptee:需要适配的接口
- Adapter:适配器,负责把
Adaptee
转换成Target
的类
不说远了,就说手机充电头,其实就是一个电源适配器,生活用电的电压是220v,而手机充电的电压是5v,所以这时候就需要使用到电源适配器将220v的电压转换为5v(如果你是直接插在插板的USB接口上的话,当我没说)。
对应上面的UML图, 生活电压就是Adaptee
,手机充电电压就是Target
,不用多说,电源适配器自然就是Adapter
了。
Target
给出
//Target接口
public interface Volt5 {
public int getVolt5();
}
//Adaptee类
public class Volt220 {
public int getVlot220(){
return 220;
}
}
//Adapter类
public class VoltAdapter extends Volt220 implements Volt5 {
@Override
public int getVolt5() {
return 5;
}
}
public class Client{
public static void main(String[] args){
VoltAdapter adapter = new VoltAdapter();
System.out.println("输出电压:" + adapter.getVolt5());
}
}
对象适配器模式
与类适配器模式不同的是,对象适配器模式不适用继承关系链接Adaptee
类,而是使用代理关系链接到Adaptee
类
这种实现方式直接将要被适配的对象传递到Adapter
中,使用组合的形式实现接口兼容的效果。比类适配器的实现方式更灵活,还有就是Adaptee
对象不会暴露出来,因为没有继承被适配对象。
//Target接口
public interface Volt5 {
public int getVolt5();
}
//Adaptee类
public class Volt220 {
public int getVlot220(){
return 220;
}
}
//Adapter类
public class VoltAdapter implements Volt5 {
Volt220 volt220;
public VoltAdapter(Volt220 volt220){
this.volt220 = volt220;
}
public int getVolt220(){
return volt220.getVlot220();
}
@Override
public int getVolt5() {
return 5;
}
}
public class Client{
public static void main(String[] args){
VoltAdapter adapter = new VoltAdapter(new Volt220());
System.out.println("输出电压:" + adapter.getVolt5());
}
}
优点
- 复用性好,当现有的类不符合需求时,通过适配器就可以使这些功能得到更好地复用。
- 扩展性好,可以更好地扩展系统的功能
缺点
过多的使用,会让代码更加凌乱。
「推荐」设计模式系列
设计模式(零)- 面向对象的六大原则
设计模式(一)- 单例模式
设计模式(二)- Builder模式
设计模式(三)- 原型模式
设计模式(四)- 工厂模式
设计模式(五)- 策略模式
设计模式(六)- 状态模式
设计模式(七)- 责任链模式
设计模式(八)- 解释器模式
设计模式(九)- 命令模式
设计模式(十)- 观察者模式
设计模式(十一)- 备忘录模式
设计模式(十二)- 迭代器模式
设计模式(十三)- 模板方法模式
设计模式(十四)- 访问者模式
设计模式(十五)- 中介者模式
设计模式(十六)- 代理模式
设计模式(十七)- 组合模式
【设计模式笔记】(十八)- 适配器模式
【设计模式笔记】(十九)- 装饰者模式
网友评论