设计模式 | 适配器模式

简介: 设计模式 | 适配器模式

说明

适配器模式(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实例传入, 这样代码就不会相互影响了,大家可以好好去尝试一下。

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

目录
相关文章
|
6月前
|
设计模式 Java API
重构旧代码的秘诀:用设计模式 - 适配器模式(Adapter)给Java项目带来新生
【4月更文挑战第7天】适配器模式是解决接口不兼容问题的结构型设计模式,通过引入适配器类实现目标接口并持有不兼容类引用,实现旧代码与新接口的协作。适用于处理兼容性问题、整合遗留代码和集成第三方库。应用时,识别不兼容接口,创建适配器类转换方法调用,然后替换原有引用。注意保持适配器简单、使用组合和考虑扩展性。过度使用可能导致系统复杂和维护成本增加,应谨慎使用。
100 4
|
6月前
|
设计模式 Java 中间件
23种设计模式,适配器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目标是让原本由于接口不匹配而不能一起工作的类可以一起工作。适配器模式主要有两种形式:类适配器和对象适配器。类适配器模式通过继承来实现适配,而对象适配器模式则通过组合来实现
102 4
|
2月前
|
设计模式 Java 程序员
Java设计模式-适配器模式(8)
Java设计模式-适配器模式(8)
|
1月前
|
设计模式 Java
Java设计模式之适配器模式
这篇文章详细讲解了Java设计模式中的适配器模式,包括其应用场景、实现方式及代码示例。
40 0
|
6月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Adapter(适配器模式)
【设计模式】JAVA Design Patterns——Adapter(适配器模式)
|
2月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
3月前
|
设计模式 XML 存储
【六】设计模式~~~结构型模式~~~适配器模式(Java)
文章详细介绍了适配器模式(Adapter Pattern),这是一种结构型设计模式,用于将一个类的接口转换成客户期望的另一个接口,使原本不兼容的接口能够一起工作,提高了类的复用性和系统的灵活性。通过对象适配器和类适配器两种实现方式,展示了适配器模式的代码应用,并讨论了其优点、缺点以及适用场景。
|
5月前
|
设计模式
适配器模式-大话设计模式
适配器模式-大话设计模式
|
4月前
|
设计模式 Go 数据处理
iLogtail设计模式问题之在iLogtail中,为何需要使用适配器模式
iLogtail设计模式问题之在iLogtail中,为何需要使用适配器模式
|
4月前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 适配器模式
js设计模式【详解】—— 适配器模式
31 0

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    53
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    37
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    61
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    56
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    40
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    105
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    75