码迷,mamicode.com
首页 > 其他好文 > 详细

23种设计模式之适配器模式

时间:2018-01-06 18:01:14      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:不同   一个   ati   例子   关系   不同的   close   style   技术分享   

现实中的例子比如各国国标的插座与插头关系,其中转换器就充当了适配器作用

技术分享图片

适配器模式:将一个类的接口转换成另一种接口,让原本不兼容的类可以兼容

就是两个接口本来没有关系,通过一个适配器类实现某个接口,可以实现另一接口的方法

1、对象适配器

火鸡冒充鸭子例子:火鸡有火鸡接口,鸭子有鸭子接口,现在想让鸭子有火鸡的功能,但是对外部看来还是鸭子功能

技术分享图片
public interface Turkey {

    void gobble();

    void fly();

}
interface Turkey火鸡接口
技术分享图片
public interface Duck {

    void quack();
    void fly();

}
interface Duck鸭子接口
技术分享图片
public class WildTurkey implements Turkey {
    public void gobble() {
        System.out.println(" Go Go ");
    }

    public void fly() {
        System.out.println("I am flying a short distance");
    }
}
WildTurkey implements Turkey
技术分享图片
public class GreenHeadDuck implements Duck {
    public void quack() {
        System.out.println(" Ga Ga ");
    }

    public void fly() {
        System.out.println("I anm flying a long distance");
    }
}
GreenHeadDuck implements Duck

鸭子有火鸡功能,就要有个火鸡适配器继承鸭子接口(内部传入的是火鸡对象,所以属于对象适配器)

技术分享图片
/**
 * 实现Duck接口,对外看似鸭子,内部实现却是火鸡
 */
public class TurkeyAdapter implements Duck {

    private Turkey turkey;

    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }

    public void quack() {
        turkey.gobble();
    }

    public void fly() {
        for (int i = 0; i < 6; i++) {
            turkey.fly();
        }
    }
}
TurkeyAdapter implements Duck
技术分享图片
public class MainTest {

    public static void main(String[] args){
        GreenHeadDuck greenHeadDuck=new GreenHeadDuck();
        WildTurkey wildTurkey=new WildTurkey();

        Duck duckTurkeyAdapter=new TurkeyAdapter(wildTurkey);
        wildTurkey.gobble();
        wildTurkey.fly();
        greenHeadDuck.quack();
        greenHeadDuck.fly();

        duckTurkeyAdapter.quack();
        duckTurkeyAdapter.fly();
    }

}
测试代码

2、类适配器

类适配器:通过多重继承目标接口和被适配者类方式来实现适配

技术分享图片

多重继承,其中继承的目标接口部分达到适配目的,而继承被适配者类的部分达到通过调用被适配者类里的方法来实现目标接口的功能

 TurkeyAdapter继承自目标接口Duck,达到适配目的,然后继承WildTurkey被适配者类,调用被适配者类内方法达到实现目标接口的功能

技术分享图片
public class TurkeyAdapter2 extends WildTurkey implements Duck {
    public void quack() {
        super.gobble();
    }

    @Override
    public void fly() {
        super.fly();
        super.fly();
        super.fly();
    }
}
TurkeyAdapter2 extends WildTurkey implements Duck
技术分享图片
public class MainTest {

    public static void main(String[] args){
        GreenHeadDuck greenHeadDuck=new GreenHeadDuck();
        WildTurkey wildTurkey=new WildTurkey();

        Duck duckTurkeyAdapter=new TurkeyAdapter(wildTurkey);
        wildTurkey.gobble();
        wildTurkey.fly();
        greenHeadDuck.quack();
        greenHeadDuck.fly();

        duckTurkeyAdapter.quack();
        duckTurkeyAdapter.fly();

        Duck duckTurkeyAdapter2=new TurkeyAdapter2();
        duckTurkeyAdapter2.quack();
        duckTurkeyAdapter2.fly();
    }

}
测试代码

对象适配器和类适配器使用了不同的方法实现适配,对象适配器使用组合,类适配器使用继承;组合比继承灵活,所以建议使用对象适配器

 

23种设计模式之适配器模式

标签:不同   一个   ati   例子   关系   不同的   close   style   技术分享   

原文地址:https://www.cnblogs.com/hujiapeng/p/8214205.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!