• [PHP] 数据映射器模式-结构型设计模式


    数据映射器是一个数据访问层,用于将数据在持久性数据存储(通常是一个关系数据库)和内存中的数据表示(领域层)之间进行相互转换。其目的是为了将数据的内存表示、持久存储、数据访问进行分离。该层由一个或者多个映射器组成(或者数据访问对象),并且进行数据的转换。映射器的实现在范围上有所不同。通用映射器将处理许多不同领域的实体类型,而专用映射器将处理一个或几个。

    例子就是数据库的ORM


    这个是数据的对象表示:

    class User{
        private string $username;
        private string $email;
        //将数组转成对象
        public static function fromState(array $state): User
        {
            return new self(
                $state['username'],
                $state['email']
            );
        }
        //通过构造函数获取对象
        public function __construct(string $username, string $email){
            $this->username = $username;
            $this->email = $email;
        }
    
        public function getUsername(): string{
            return $this->username;
        }
    
        public function getEmail(): string{
            return $this->email;
        }
    }

    这个是数据的映射,将存储中的数据映射到对象的中间那层

    class UserMapper{
        private StorageAdapter $adapter;
        public function __construct(StorageAdapter $storage){
            $this->adapter = $storage;
        }
        public function findById(int $id): User{
            $result = $this->adapter->find($id);
            return $this->mapRowToUser($result);
        }
        private function mapRowToUser(array $row): User{
            return User::fromState($row);
        }
    }

    这个是数据的访问

    class StorageAdapter
    {
        private array $data = [];
    
        public function __construct(array $data)
        {
            $this->data = $data;
        }
        public function find(int $id)
        {
            if (isset($this->data[$id])) {
                return $this->data[$id];
            }
        }
    }

    使用的过程$user就是最终的对象

    $storage = new StorageAdapter([1 => ['username' => '陶士涵', 'email' => '630892807@qq.com']]);
    $mapper = new UserMapper($storage);
    $user = $mapper->findById(1);
  • 相关阅读:
    博客园安卓客户端合仔茶版本V4.0震撼发布
    提示功能的检索框
    .net 玩自动化浏览器
    《表单篇》DataBase之大数据量经验总结
    自定义表主键
    一次网络程序Debug过程
    关于.NET下开源及商业图像处理(PSD)组件
    利用反射从程序集dll中动态调用方法
    Linux内核源码分析方法
    wcf基础教程之 契约(合同)Contract
  • 原文地址:https://www.cnblogs.com/taoshihan/p/13820452.html
Copyright © 2020-2023  润新知