前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式第五讲-适配器模式

设计模式第五讲-适配器模式

作者头像
用户2825413
发布2019-07-16 11:04:09
3320
发布2019-07-16 11:04:09
举报

简介

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

存在两种适配器: “对象适配器” 和 “类”适配器 (因为大部分语言不支持多重继承,所以此处指的是对象适配器)

y适配器模式包含一下三个角色:

  1:Target(目标抽象类):目标抽象类定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类。在类适配器中,由于java、php语言不支持多重继承,所以它只能是接口。

  2:Adapter(适配器类):它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。它是适配器模式的核心。

  3:Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类包好了客户希望的业务方法。

图例:

场景设置

系统已经在之前实现了订单服务,在一个类里面实现的(坑爹的万能类),这个代码很复杂你们不想再冒风险去改动,并且有外部相关服务正在持续使用它。

就在这个时候,欠扁的产品给你提了一个需求,要你针对我们的后台改造下某个共用的接口,在这个基础上增加些字段,比如下单人的姓名.

我们用简单的适配器模式实现下

代码实现

Order.php 相当于Adaptee需要适配的类

代码语言:javascript
复制
<?php

class Order
{
    /**
     * 根据订单号查询信息
     *
     * @param $orderNo
     * @return array
     */
    public function getInfoByOrderNo($orderNo)
    {
        //todo 数据资源操作
        return [
            'order' => [
                'orderId' => '2018050320423042',
                'title'   => '冬天大棉袄',
                'price'   => '68000',
            ],
        ];
    }
}

客户期望实现的接口类

代码语言:javascript
复制
<?php

interface OrderBackstage
{
    public function getUserOrderByOrderNo(int $orderNo): string;
}

OrderAdepter 适配类(把源接口转换成目标接口)

代码语言:javascript
复制
<?php

class OrderAdepter implements OrderBackstage
{
    private $orderService = null;

    public function __construct()
    {
        $this->orderService = new Order();
    }

    /**
     * 根据订单号获取用户userid
     */
    public function getUserOrderByOrderNo(int $orderNo): string
    {
        $order = $this->orderService->getInfoByOrderNo($orderNo);
        if (!empty($order)) {
            //todo 其它查询拼装
            $order['user'] = [
                'uid'    => 24,
                'name'   => '小明',
                'avatar' => 'http://xxx.com/xx.png'
            ];
        } else {
            $order = [];
        }

        return json_encode($order);
    }

}

调用:

代码语言:javascript
复制
$order  = new OrderAdepter();
$result = $order->getUserOrderByOrderNo(123);
echo $result;

output:

代码语言:javascript
复制
{"order":{"orderId":"2018050320423042","title":"\u51ac\u5929\u5927\u68c9\u8884","price":"68000"},"user":{"uid":24,"name":"\u5c0f\u660e","avatar":"http:\/\/xxx.com\/xx.png"}}

具体UML图:

总结

适配器模式比较简单,代码均采用php语言实现。

适配器模式主要应用于希望复用一些现存的类,但是接口要求又与复用环境要求不一致的情况。

两个类所做的事情相同或相似,但是具有不同的业务或接口使用时(比如对后台提供接口,可展示一些敏感电话信息,但对外就需要过滤掉)

使用适配器可最小化的影响旧有的业务系统,来增加新的功能。

通过适配器模式,我们下次可以看看外观模式究竟和有什么区别..

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

本文分享自 呆呆熊的技术路 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 场景设置
  • 代码实现
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档