适配器模式:
把一个类的接口变换成客户端所期待的另一种接口,从而使原来因接口不匹配而无法在一起工作的两个类能够在一起工作。
适配器有两种模式:
类的适配器模式
对象的适配器模式
下面重点讲下类适配器模式。
类的适配器模式所涉及的角色:
目标角色: 这就是所期待得到的接口。目标不可以是类。
源角色: 现有需要适配的接口
适配器角色: 适配器类是本模式的核心,适配器把源接口转换成目标接口。显然这一角色不可以是接口,而必须是具体类。
对象的适配器模式的效果:
1.一个适配器可以把多种不同的源适配到同一个目标,换言之,同一个适配器可以把源类和它的子类都适配到目标接口。
2.与类的适配器模式相比,要想置换源类的方法不容易。
3.虽然想置换源类的方法不容易,但是添加新方法容易,且适用于所有的源。
废话不多说,直接上代码,首先抽象一个场景:中国人和韩国人谈生意,但是双方都不懂对方的语言,怎么办?现在有2个办法解决,一个是让韩国人学会说汉语;一个是让韩国人找一个翻译能听懂双方的语言。无疑第一解决办法耗时耗力,不符合要求,所以第二个解决方法服合要求。这里第二个解决方案就是一个典型的适配器模式。
源角色:
public interface People {
void speak();
}
目标角色:
public class Korean{
public void be() {
System.out.println("我是韩国人");
}
}
//这是个打酱油角色,只是做个对比
public class Chinese{
public void be() {
System.out.println("我是中国人");
}
}
适配器:
public class Adapter extends Korean implements People{
@Override
public void speak() {
super.be();
System.out.println("我会说汉语...");
}
}
实现方法,这里是基于android的,java直接写一个测试类在main方法中实现:
mbtnAdapter.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
People korean = new Adapter();
korean.speak();
}
});
输出:
好了,韩国人可以说汉语了,你们谈生意吧。