设计模式(12)-适配器模式详解(易懂)
适配器模式的定义
在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
共有两类适配器模式:
对象适配器模式
-
在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适 配器调用被包裹对象的物理实体。
类适配器模式
-
-- 这种适配器模式下,适配器继承自已实现的类。
模型:
-
Target:目标角色,定义把其他类转换为我们期望的角色
-
Adaptee:初始角色,即我们原始的类和接口对象,如“A->B”,其中 A就是初始角色,它是一直存在的
-
Adapter:适配器角色,也就是我们今天的重点,适配器需要新创建,通过继承等方式把初始角色转换成为目标角色。
代码演示(类适配器模式):
1.AbstractTarget:抽象目标角色
public interface AbstractTarget {
//抽象目标角色方法
public void target();
}
2.具体的目标角色
public class Target implements AbstractTarget {
@Override
public void target() {
Log.d("qzs","实现目标方法");
}
}
3.初始角色Adaptee:
public class Adaptee {
//初始的方法
public void adaptee(){
Log.d("qzs","初始的逻辑");
}
}
4.适配器角色:
public class Adapter extends Adaptee implements AbstractTarget {
@Override
public void target() {
adaptee();
}
}
5.调用
AbstractTarget tr=new Adapter();
tr.target();
实例说明
例如,我手中有Android数据线和iphone手机,我想用安卓数据线给iphone手机充电。此时:
-
初始角色:Android数据线
-
目标角色:iphone手机
-
适配器:数据线转换器
代码演示:
1.Android数据线:
public class AndroidLine {
public void charge(){
Log.d("qzs","Android数据线给Android手机充电");
}
}
2.目标角色:
public interface AbstractIphone {
public void target();
}
3.数据线转换器
public class PhoneLineAdapter extends AndroidLine implements AbstractIphone {
@Override
public void target() {
super.charge();
Log.d("qzs","但是我可以通过数据线转换器来给iphone手机充电");
}
}
4.调用
AbstractIphone tr1=new PhoneLineAdapter();
tr1.target();
运行:
适配器模式的优点及其他
1.优点
-
灵活性好
-
通过适配器可以让两个没有关系的类一起运行
-
增加了类的通透性
2.注意:
当初始角色的接口和实现类为多个时,我们在写适配器不能用继承的方式。可以通过在适配器中构造函数的方法来传递对象从而实现数据处理,也就是对象适配器模式。
文章参考了网上信息以及《设计模式之禅》