zoukankan      html  css  js  c++  java
  • [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);
  • 相关阅读:
    CF1454F Array Partition
    leetcode1883 准时抵达会议现场的最小跳过休息次数
    leetcode1871 跳跃游戏 VII
    leetcode1872 石子游戏VIII
    CF1355C Count Triangles
    CF1245D Shichikuji and Power Grid
    CF1368C Even Picture
    CF1368D AND, OR and square sum
    CF1395C Boboniu and Bit Operations
    SpringBoot和开发热部署
  • 原文地址:https://www.cnblogs.com/taoshihan/p/13820452.html
Copyright © 2011-2022 走看看