HeadFirst-设计模式-适配器模式

适配器模式:将一个类的接口转换成用户期望的另一个接口 。适配器让原本接口不兼容的类可以合作无间
就相当于插座和插排,你的热水壶是三孔插头,插座是两孔的,用不了,这个时候你拿一插排,接线头是两孔的,插排上有三孔的就可以用了 。
简单如图:

HeadFirst-设计模式-适配器模式

文章插图

话不多说、上实例:
现有两个不同的接口,鸭子Duck提供嘎嘎叫quak()和飞fly()方法,还有一火鸡接口提供咕咕叫()和飞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.再来定义火鸡接口和具体火鸡类
HeadFirst-设计模式-适配器模式

文章插图
//定义火鸡接口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.运行结果
我是绿头鸭,我会呱呱呱 。。
我是绿头鸭,我会飞 。。
我是火鸡,我会咕咕叫 。。
HeadFirst-设计模式-适配器模式

文章插图
我是火鸡,只能飞很近 。。
我是火鸡,我会咕咕叫 。。
我是火鸡,只能飞很近 。。
我是火鸡,只能飞很近 。。
我是火鸡,只能飞很近 。。
我是火鸡,只能飞很近 。。
我是火鸡,只能飞很近 。。
我的理解是这样的,就是A B俩接口,方法各不同,在定义一个类实现A接口,重写A接口方法里去调B接口的方法,达到适配的目的,就是你看上去调的A接口的方法,其实执行的是B接口的方法,神不神奇?
但是这样只能达到单项适配的目的发,翻过来A接口适配B接口的适配还要在写一个?多麻烦,直接实现A B 接口,把A B 接口方法都重写不是达到双向适配了吗?
类适配器 PK 对象适配器
【HeadFirst-设计模式-适配器模式】