专栏首页憧憬博客分享设计模式 | 适配器模式

设计模式 | 适配器模式

说明

适配器模式(adapter), 模式定义: 将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

从名字可以知道, 是为了适配不兼容的东西而产生, 我们电脑可能充电需要200v的电压, 但是有一天换了个充电的是300v的, 和电脑原本不兼容, 这个时候就会有适配器来帮我们转化

例如说有个场景:

我们公司内部有一套用户系统, 但是这个时候和其他公司合作, 希望两边用户实现互通, 查询可以选择查我们这边 也可以查另一边, 但是两边数据结构不一样, 在页面不可能做处理, 这个时候就需要转化成我们想要的格式, 这中间这些转化操作抽离出来叫适配器。

实现如下:

示例

<?php
/**
 * Created by 憧憬.
 */

interface IUserInfo {
    public function getUsername();
    public function getHomeAddress();
    public function getMobileNumber();
    public function getJobPosition();
    public function getOfficeTelNumber();
    public function getHomeTelNumber();
}


class UserInfo implements IUserInfo {
    public function getUsername()
    {
        echo 'user name';
        return null;
    }

    public function getHomeAddress()
    {
        echo 'getHomeAddress';
        return null;
    }

    public function getMobileNumber()
    {
        echo 'getMobileNumber';
        return null;
    }

    public function getJobPosition()
    {
        echo 'getJobPosition';
        return null;
    }

    public function getOfficeTelNumber()
    {
        echo 'getOfficeTelNumber';
        return null;
    }

    public function getHomeTelNumber()
    {
        echo 'getHomeTelNumber';
        return null;
    }
}


/**
 * 外部用户系统接口
 * Interface IOuterUser
 */
interface IOuterUser {

    //基本信息,比如名称,性别,手机号码了等
    public function getUserBaseInfo();

    //工作区域信息
    public function getUserOfficeInfo();

    //用户的家庭信息
    public function getUserHomeInfo();
}


/**
 * 外部用户系统实现类
 * Class OuterUser
 */
class OuterUser implements IOuterUser {

    /**
     * 用户的基本信息
     * @return array
     * @author: 憧憬
     */
    public function getUserBaseInfo()
    {
        $arr = [
            'userName' => '这个员工叫混世魔王..',
            'mobileNumber' => '这个员工电话是...',
        ];

        return $arr;
    }

    /**
     * 员工的工作信息,比如职位了等
     * @return array
     * @author: 憧憬
     */
    public function getUserOfficeInfo()
    {
        $arr = [
            'jobPosition' => '这个人的职位是BOSS...',
            'officeTelNumber' => '员工的办公电话是....',
        ];

        return $arr;
    }

    /**
     * 员工的家庭信息
     * @return array
     * @author: 憧憬
     */
    public function getUserHomeInfo()
    {
        $arr = [
            'homeTelNumbner' => '员工的家庭电话是.....',
            'homeAddress' => '员工的家庭地址是....',
        ];

        return $arr;
    }
}


// 那怎么把外系统的用户信息包装成我们公司的人员信息呢?

class OuterUserInfo extends OuterUser implements IUserInfo {

    private $baseInfo;
    private $homeInfo;
    private $officeInfo;

    /**
     * OuterUserInfo constructor.
     */
    public function __construct()
    {
        $this->baseInfo = parent::getUserBaseInfo();
        $this->homeInfo = parent::getUserHomeInfo();
        $this->officeInfo = parent::getUserOfficeInfo();
    }


    public function getUsername()
    {
        return $this->baseInfo['userName'];
    }

    public function getHomeAddress()
    {
        return $this->homeInfo['homeAddress'];
    }

    public function getMobileNumber()
    {
        return $this->baseInfo['mobileNumber'];
    }

    public function getJobPosition()
    {
        return $this->officeInfo['jobPosition'];
    }

    public function getOfficeTelNumber()
    {
        return $this->officeInfo['officeTelNumber'];
    }

    public function getHomeTelNumber()
    {
        return $this->homeInfo['homeTelNumbner'];
    }
}

// 选择查询

//$user = new UserInfo();
$user = new OuterUserInfo();

// 查询用户
for ($i = 0; $i< 100; $i++) {
    echo $user->getMobileNumber();
}

使用了适配器模式只修改了一句话,其他的业务逻辑都不用修改就解决了系统对接的问题, 而且在我们实际系统中只是增加了一个业务类的继承,就实现了可以查本公司的员工信息,也可以查人力 资源公司的员工信息,尽量少的修改,通过扩展的方式解决了该问题。

适配器还分为类适配器和对象适配器,这种是类适配器模式, 这种直接继承的方式不是很好, 耦合比较高, 其实可以改为组合模式, 不使用继承, 将OuterUser实例传入, 这样代码就不会相互影响了,大家可以好好去尝试一下。

本文为作者原创,手码不易,允许转载,转载后请以链接形式说明文章出处。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SOLID设计原则和我的一点个人感悟

    技术可以落后,思想必须先进。一栋好的大楼,并非是表面看起来,砖、泥... ,如果我们以普通人的眼光去看待这么一栋楼,使用原始材料一点一点搭建起来,那将是无法想象...

    憧憬博客
  • 设计模式 | 桥接模式

    在开发过程中,我们很多类具都是具有两个或多个维度以上的,例如 图形可以按照形状分,也可以按照颜色分。

    憧憬博客
  • Nginx多方面调优策略

    Nginx作为web server热门项目,有着高性能、简单配置以及跨平台,越来越多的企业选择使用它,我们这篇博客来说一下如何优化Nginx

    憧憬博客
  • Web前端----Javascript模块化

    一提到模块化,也许我们首先想到的是做项目的时候进行模块设计,按照功能划分不同的模块,最后通过模块的选择和组合组成最终的产品;那把模块化的思想放到前端页面,js...

    令仔很忙
  • [C#]使用IFormattable接口来实现字符串格式化

    本文为原创文章、源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称、作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:...

    CNXY
  • 智能合约:Ethernaut题解(一)

    Ethernaut 是一个部署在 Ropsten 测试网络上面的智能合约代码审计类题目,网址:

    yichen
  • SOLID原则(OOD&OOP)

    SOLID原则是面向对象编程和面向对象设计的头五大原则。学习及应用这五大原则可以构建一个易于维护和扩展的应用程序,我们一起看看到底是那五大原则。

    小世界的野孩子
  • PHP设计模式之抽象工厂模式

    工厂模式系列中的重头戏来了,没错,那正是传闻中的抽象工厂模式。初次听到这个名字的时候你有什么感觉?反正我是感觉这货应该是非常高大上的,毕竟包含着“抽象”两个字。...

    硬核项目经理
  • 在 Go 语言中使用猴子补丁

    很多人认为猴子补丁(A monkey patch is a way for a program to extend or modify supporting s...

    李海彬
  • Spring Cloud Gateway 扩展支持多版本控制及灰度发布

    什么是灰度发布,概念请参考,我们来简单的通过下图来看下,通俗的讲: 为了保证服务升级过程的平滑过渡提高客户体验,会一部分用户 一部分用户递进更新,这样生产中会同...

    冷冷

扫码关注云+社区

领取腾讯云代金券