TL;DR
ミュータブルを前提としたオブジェクト指向プログラミングにおいて、永続化を隠蔽するためのパターン。エリック・エヴァンスのドメイン駆動設計で、データベースにアクセスするためのパターンとして紹介されている。
なぜ必要か
Martin Fowler の『Patterns of Enterprise Application Architecture』によると、この層を足すと、重複するクエリのロジックを減らせる。ドメインとデータマッピングをきれいに分け、依存を一方向にでき、永続化の層をよりオブジェクト指向的に扱える。
仕組み
Martin Fowler の定義では、リポジトリは、ドメインの層とデータマッピングの層の間を、ドメインオブジェクトを扱うコレクションのようなインタフェースで仲介する。メモリ上にあるドメインオブジェクトのコレクションのように振る舞う。クライアントはクエリの条件を宣言的に組み立ててリポジトリに渡し、データのマッピングはリポジトリが受け持つ。
注意点
関数型プログラミングでは、このパターンを採用する必要はない。すべてを関数としてモデリングし、永続化を端に追いやると、永続化を隠蔽する必要がなくなる。必要な関数だけをパラメータで受け取って使えるので、保守もしやすい。