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);
  • 相关阅读:
    jackson 解析json含有不规则的属性的json字符串的方法
    swift入门-实现简单的登录界面
    github git.exe位置
    linux之SQL语句简明教程---IN
    怎么样才算是精通 C++?
    BZOJ2028: [SHOI2009]会场预约(set)
    BZOJ1058: [ZJOI2007]报表统计(set)
    洛谷P2391 白雪皑皑(并查集)
    BZOJ4514: [Sdoi2016]数字配对(费用流)
    BZOJ3143: [Hnoi2013]游走(期望DP 高斯消元)
  • 原文地址:https://www.cnblogs.com/taoshihan/p/13820452.html
Copyright © 2011-2022 走看看