说到适配器模式,我突然想到了我刚买的手机,因为这款新手机的耳机孔和国标的不同,商家就送了一个转接口,可以把平常的耳机用于新手机中,这其实也就是适配器的概念。下面我用一个例子来更具体的说明一下
要让火鸡实现鸭子的功能
一、使用对象适配器
概念:将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容
原理图:
对于鸭子Duck:
public interface Duck {
public void quack();
public void fly();
}
对于火鸡Turkey:
public interface Turkey {
public void gobble();
public void fly();
}
鸭子实现类GreenDuck :
public class GreenDuck implements Duck {
public void quack() {
System.out.println("Ga Ga");
}
public void fly() {
System.out.println("im flying a long distance");
}
}
火鸡实现类WildTurkey :
public class WildTurkey implements Turkey {
public void gobble() {
System.out.println("Gu Gu");
}
public void fly() {
System.out.println("im flying a short distance");
}
}
如果想要需求中的结果,我们必须要有一个适配器TurkeyAdaptor :
public class TurkeyAdaptor implements Duck {
Turkey turkey;
public TurkeyAdaptor(Turkey turkey){
this.turkey=turkey;
}
public void quack() {
turkey.gobble();
}
public void fly() {
for(int i=0;i<5;i++){
turkey.fly();
}
}
}
这样就可以实现,虽然火鸡伪装的鸭子还是GuGu叫,但是模拟的飞行,用多次短飞行模拟鸭子的长距离飞行。
public class Test {
public static void main(String[] args) {
GreenDuck greenDuck=new GreenDuck();
WildTurkey wildTurkey=new WildTurkey();
TurkeyAdaptor wildTurkeyAdaptor=new TurkeyAdaptor(wildTurkey);
greenDuck.quack();
greenDuck.fly();
wildTurkey.gobble();
wildTurkey.fly();
wildTurkeyAdaptor.quack();
wildTurkeyAdaptor.fly();
}
}
二、类适配器
概念:通过多重继承目标接口和被适配者方式来实现适配
原理图:
对于上面的例子,我们需要更改适配器TurkeyAdaptor1 :
public class TurkeyAdaptor1 extends WildTurkey implements Duck {
public void quack() {
super.gobble();
}
public void fly(){
super.fly();
super.fly();
super.fly();
}
}
最后实现的结果还是和对象适配器的结果是一样的。