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

版权声明:来这世间走一遭总的留下点什么 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 对象适配器
这里写图片描述

猜你喜欢

转载自blog.csdn.net/FightingITPanda/article/details/80818164