## 定义
    对数据源的访问与存储进行封装，提供一个数据访问对象类负责对存储的数据进行管理和操作，规范数据存储格式。  
    数据访问对象模式,简称DAO模式,也叫数据映射模式，或数据对象映射模式。



## 结构中包含的角色
1. 数据访问对象接口（Data Access Object Interface）  ModelDAO   抽象操作数据库的方法
2. 数据访问对象实体类（Data Access Object concrete class）ModelDaoImpl   具体操作数据库的方法
3. 模型对象/数值对象（Model Object/Value Object） Model 数据库的数据对应的实体类

## 最小可表达代码
    class Model
    {
        private $id;
    
        public function __construct(int $id)
        {
            $this->id = $id;
        }
    
        public function getId()
        {
            return $this->id;
        }
    }

    interface ModelDao 
    {
        public function getModels();
        public function getModel(int $id);
    }

    class ModelDaoImpl implements ModelDao 
    {
        private $models;

        public function __construct()
        {
            $this->models = [
                new Model(1),
                new Model(2),
            ];
        }

        public function getModels()
        {
            return $this->models;
        }
    
        public function getModel(int $id)
        {
            foreach ($this->models as $model) {
                if ($id == $model->getId()) return $model;
            }

            return null;
        }
    }

    $modelDao = new ModelDaoImpl();
    $models = $modelDao->getModels();
    $model = $modelDao->getModel(1);
    var_dump($models, $model);

## 实际应用场景
1. Laravel的Eloquent



