Idéalement, votre couche DAO «élimine» l'accès à certains systèmes de stockage de données (base de données, système de fichiers, annuaire LDAP, ...). Donc, dans ce sens, il est utilisé uniquement pour les tâches liées à l'accès aux données. Cependant, vous pouvez également avoir une couche DAO qui accède à un service Web ou à un autre composant externe à votre application. C'est le point clé, il donne accès à un composant externe.
L'idée principale est qu'il n'y a pas de détails d'implémentation de votre couche DAO qui échappent aux couches supérieures (isolation). Un bon point de départ pour penser à ceci est: que devrais-je faire si je prévois de remplacer le composant (une base de données par exemple) auquel ma couche DAO donne accès? Par exemple, vous avez des données dans des fichiers XML et vous prévoyez de migrer les données vers une base de données. Supposons que vous ayez toutes sortes d'exceptions liées au langage XML qui échappent à votre couche DAO. Il devient alors assez difficile de migrer votre couche XML vers une couche de base de données. Cependant, si vous avez encapsulé tous les détails d'implémentation de votre couche DAO, cela deviendra beaucoup plus facile. En fin de compte, il s'agit de la maintenabilité de votre code. Moins vous avez de dépendances sur les détails de mise en œuvre d'une couche spécifique (services, DAO, ...), mieux votre code est maintenable.
"que devrais-je faire si je prévois de remplacer le composant (une base de données par exemple)" - si je me souviens bien, il s'agissait de Data Access Layer dans l'architecture 3-tiers (par Fowler). – Roman