前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之适配器与外观模式(一)

设计模式之适配器与外观模式(一)

作者头像
程序员小跃
发布2019-12-26 12:03:42
4580
发布2019-12-26 12:03:42
举报
文章被收录于专栏:程序员小跃

学习技术的过程总是需要慢慢积累的,所以持续学习是一个一直存在的事情。很高兴,我能一直通过看书输出设计模式相关的系列,也很感谢各位朋友的持续关注。

废话不多说啦,今天我们继续学习一个对于Android开发来说可能不太陌生的模式,适配器模式和外观模式。曾经或者现在正在做Android开发的你,是不是很熟悉这个呢?对的,Android里很多控件,可都是需要适配器来处理的噢,那我们赶紧进来看看吧。

我们周围的适配器

适配器是什么,你一定不难理解,因为现实就存在。比方说,如果你需要在欧洲国家使用美国制造的笔记本电脑,你可能需要使用一个交流电的适配器…它的工作是将欧式插座转换成美式插座,好让美式插头可以插进这个插座得到电力。

这就是真实世界的适配器,那面向对象适配器又是什么?其实,适配器和真实世界的适配器扮演着同样的角色:将一个接口转换成另一个接口,以符合客户的期望。用一个形象点的图表示就是:

火鸡转换器

有了前面的铺垫,我们来看下下面这个场景。如果它走起路来像只鸭子,叫起来像只鸭子,你觉得他一定是一只鸭子吗?现在这个答案就未必是肯定的回答了,它可能是一只包装了鸭子适配器的火鸡。

结合第一章的鸭子的例子,我们在这里好好利用起来。先来看看鸭子接口和类的一个稍微简化的版本:

代码语言:javascript
复制
// 叶子实现了Duck接口,具备呱呱叫和飞行的能力
public interface Duck {
    public void quack();
    public void fly();
}

绿头鸭是鸭子的子类:

代码语言:javascript
复制
public class MallardDuck implements Duck {
    public void quack() {
        System.out.println("Quack");
    }

    public void fly() {
        System.out.println("I'm flying");
    }
}

这里为您介绍最新的“街头顽禽”:

代码语言:javascript
复制
// 火鸡不会呱呱叫,只会咯咯叫
public interface Turkey {
    public void gobble();
    public void fly();
}

// 火鸡的具体实现
public class WildTurkey implements Turkey {
    public void gobble() {
        System.out.println("Gobble gobble");
    }

    public void fly() {
        System.out.println("I'm flying a short distance");
    }
}

正常情况下,是按照上面的流程来就好了。但是现在如果你缺少鸭子对象,想用一些火鸡对象来冒充。但是两个根本不是同一个东西,怎么冒充呢?适配器模式的威力就来了。

代码语言:javascript
复制
// 首先,你需要实现想转换成的类型接口,也就是你的客户所期望看到的接口
public class TurkeyAdapter implements Duck {
    Turkey turkey;

    // 接着,需要取得适配器的对象引用
    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }

    // 我们需要实现接口中的方法。quack()在类之间的转换,只需要调用gobble即可
    public void quack() {
        turkey.gobble;
    }

    public void fly() {
        for(int i = 0; i < 5; i++) {
            turkey.fly();
        }
    }
}
测试适配器
代码语言:javascript
复制
public class DuckTestDrive {
    public static void main(String[] args) {
        // 创建一只鸭子
        MallardDuck duck = new MallardDuck();

        // 创建一只火鸡
        WildTurkey turkey = new WildTurkey();
        // 将火鸡包装进一个火鸡的适配器中,使他看起来像一只鸭子
        Duck turkeyAdapter = new TurkeyAdapter(turkey);

        System.out.println("The Turkey says...");
        // 测试这只火鸡
        turkey.gobble();
        turkey.fly();

        // 测试鸭子,传入一个鸭子对象
        System.out.println("\nThe Duck says...");
        testDuck(duck);

        System.out.println("\nThe TurkeyAdapter says...");
        // 重点在这,我们传入一个假装是鸭子的火鸡
        testDuck(turkeyAdapter);

    }

    static void testDuck(Duck duck) {
        duck.quack();
        duck.fly();
    }
}
适配器模式解析

看了上面的例子,是不是觉得适配器很神奇呢。通过以假换真的方式实现了火鸡带鸭子的功能。那我们来看下,到底是怎么一回事

客户使用适配器的过程如下:

  1. 客户通过目标接口调用适配器的方法对适配器发出请求
  2. 适配器使用被适配者接口请求转换成被适配者的一个或多个调用接口
  3. 客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用
定义适配器模式

玩够了鸭子、火鸡和交流电适配器,现在让我们进入真实世界,并看看适配器模式的正式定义:

适配器模式将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。

转换成类图就是:

这个适配器模式充满着良好的OO设计原则:使用对象组合,以修改的接口包装被适配者;这种做法还有额外的优点,那就是,被适配者的任何子类,都可以搭配着适配器使用

也请留意,这个模式是如何把客户和接口绑定起来,而不是和实现绑定起来的。我们可以使用数个适配器,每一个都负责转换不同组的后台类。或者,也可以加上新的实现,只要它们遵循目标接口就可以。

哈哈,讲到这里适配器模式差不多就介绍完了。小编曾经写Android的时候,都不知道适配器是啥东西,只知道盲目的使用。学了设计模式,终于知道适配器是干嘛 用的了。Andorid世界里,那么多需要使用适配器的控件,你现在清楚了吗?

下次我们将介绍外观模式,我们下次再会。

爱生活,爱学习,爱感悟,爱挨踢

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 奔跑吧攻城狮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 我们周围的适配器
  • 火鸡转换器
  • 测试适配器
  • 适配器模式解析
  • 定义适配器模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档