版权声明:来这世间走一遭总的留下点什么 https://blog.csdn.net/FightingITPanda/article/details/80818164
适配器模式:将一个类的接口转换成用户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间
就相当于插座和插排,你的热水壶是三孔插头,插座是两孔的,用不了,这个时候你拿一插排,接线头是两孔的,插排上有三孔的就可以用了。
简单如图:
】
话不多说、上实例:
现有两个不同的接口,鸭子Duck提供嘎嘎叫quak()和飞fly()方法,还有一火鸡接口Turkey提供咕咕叫gooble()和飞fly()方法,现在想让火鸡对象也能具备鸭子的行为,你觉得可能吗?
1.先来定义鸭子接口和具体鸭子类
//定义鸭子接口
interface Duck2{
public void quak();
public void fly();
}
//绿头鸭实例
class MallarDuck implements Duck2{
public void quak(){
System.out.println("我是绿头鸭,我会呱呱呱。。");
}
public void fly(){
System.out.println("我是绿头鸭,我会飞。。");
}
}
2.再来定义火鸡接口和具体火鸡类
//定义火鸡接口
interface Turkey{
public void gooble();
public void fly();
}
//火鸡实例
class WildTurkey implements Turkey{
public void gooble(){
System.out.println("我是火鸡,我会咕咕叫。。");
}
public void fly(){
System.out.println("我是火鸡,只能飞很近。。");
}
}
3.现在就可以来定义会鸭子行为的火鸡适配器接口了
火鸡是不会嘎嘎叫的,只不过它调用的是嘎嘎叫方法,真正还是咕咕叫的。也就是实现鸭子的接口执行火鸡的方法
//适配器来了 具有鸭子功能的火鸡适配器
class TurkeyAdapter implements Duck2{
Turkey turkey;
public TurkeyAdapter(Turkey turkey){
this.turkey = turkey;
}
public void quak(){//实现鸭子接口,要重写鸭子的抽象方法,实际去执行火鸡的方法
turkey.gooble();
}
public void fly(){//同上 飞5次
for(int i=0;i<5;i++){
turkey.fly();
}
}
}
4.现在就可以简单测试一下,让火鸡执行鸭子的方法啦
public class AdapterPattern {
public static void main(String args[]){
MallarDuck duck = new MallarDuck();//先定义个鸭子对象
WildTurkey turkey = new WildTurkey();//定义个火鸡对象
duck.quak();//鸭子叫
duck.fly();//鸭子飞
turkey.gooble();//火鸡咕咕叫
turkey.fly();//火鸡飞
//重点来了
TurkeyAdapter adapter = new TurkeyAdapter(turkey);//创建适配器对象,传入火鸡对象。
adapter.quak();//让火鸡执行鸭子叫
adapter.fly();//让火鸡像鸭子一样飞
}
}
5.运行结果
我是绿头鸭,我会呱呱呱。。
我是绿头鸭,我会飞。。
我是火鸡,我会咕咕叫。。
我是火鸡,只能飞很近。。
我是火鸡,我会咕咕叫。。
我是火鸡,只能飞很近。。
我是火鸡,只能飞很近。。
我是火鸡,只能飞很近。。
我是火鸡,只能飞很近。。
我是火鸡,只能飞很近。。
我的理解是这样的,就是A B俩接口,方法各不同,在定义一个类实现A接口,重写A接口方法里去调B接口的方法,达到适配的目的,就是你看上去调的A接口的方法,其实执行的是B接口的方法,神不神奇?
但是这样只能达到单项适配的目的发,翻过来A接口适配B接口的适配还要在写一个?多麻烦,直接实现A B 接口,把A B 接口方法都重写不是达到双向适配了吗?
类适配器 PK 对象适配器