DAO هو اختصار لـ Data Access Object. يتم استخدام نمط التصميم DAO لفصل منطق الاستمرارية في طبقة منفصلة. بهذه الطريقة، يبقى الخدمة بالكامل في الظلام حول كيفية إجراء العمليات المنخفضة المستوى للوصول إلى قاعدة البيانات. يُعرف هذا بمبدأ فصل المنطق.
نمط تصميم DAO
مع نمط تصميم DAO، لدينا المكونات التالية التي يعتمد عليها تصميمنا:
- النموذج الذي يتم نقله من طبقة إلى أخرى.
- الواجهات التي توفر تصميمًا مرنًا.
- تنفيذ الواجهة والذي هو تنفيذ ملموس لمنطق الاستمرارية.
تنفيذ نمط DAO
مع المكونات المذكورة أعلاه، دعونا نحاول تنفيذ نمط DAO. سنستخدم 3 مكونات هنا:
- نموذج
Book
الذي يتم نقله من طبقة إلى أخرى. - واجهة
BookDao
التي توفر تصميمًا مرنًا وواجهة برمجة تطبيقات للتنفيذ. BookDaoImpl
فئة ملموسة هي تنفيذ لواجهةBookDao
.
دعونا نضع هذا المنطق في مخطط:
فئة نموذج نمط DAO
الآن، دعونا نضع كائن النموذج الخاص بنا.
package com.journaldev.model;
public class Books {
private int isbn;
private String bookName;
public Books() {
}
public Books(int isbn, String bookName) {
this.isbn = isbn;
this.bookName = bookName;
}
// طرق الحصول على القيم وتعيينها
}
إنه كائن بسيط يحتوي فقط على خاصيتين لجعل الأمور بسيطة.
واجهة نمط DAO
لنحدد الواجهة للوصول إلى البيانات المرتبطة بها على مستوى الصمود.
package com.journaldev.dao;
import com.journaldev.model.Books;
import java.util.List;
public interface BookDao {
List<Books> getAllBooks();
Books getBookByIsbn(int isbn);
void saveBook(Books book);
void deleteBook(Books book);
}
تنفيذ نمط DAO
بعد ذلك، ننشئ فئة ملموسة تنفيذ الواجهة أعلاه.
package com.journaldev.daoimpl;
import com.journaldev.dao.BookDao;
import com.journaldev.model.Books;
import java.util.ArrayList;
import java.util.List;
public class BookDaoImpl implements BookDao {
// القائمة تعمل كقاعدة بيانات
private List books;
public BookDaoImpl() {
books = new ArrayList<>();
books.add(new Books(1, "Java"));
books.add(new Books(2, "Python"));
books.add(new Books(3, "Android"));
}
@Override
public List getAllBooks() {
return books;
}
@Override
public Books getBookByIsbn(int isbn) {
return books.get(isbn);
}
@Override
public void saveBook(Books book) {
books.add(book);
}
@Override
public void deleteBook(Books book) {
books.remove(book);
}
}
استخدام نمط DAO
وأخيرًا ، قمنا باستخدام هذا التنفيذ في طريقة main() الرئيسية لدينا:
package com.journaldev;
import com.journaldev.dao.BookDao;
import com.journaldev.daoimpl.BookDaoImpl;
import com.journaldev.model.Books;
public class AccessBook {
public static void main(String[] args) {
BookDao bookDao = new BookDaoImpl();
for (Books book : bookDao.getAllBooks()) {
System.out.println("Book ISBN : " + book.getIsbn());
}
//تحديث الطالب
Books book = bookDao.getAllBooks().get(1);
book.setBookName("Algorithms");
bookDao.saveBook(book);
}
}
مزايا نمط DAO
هناك العديد من المزايا لاستخدام نمط DAO. دعونا نذكر بعضها هنا:
- عند تغيير آلية الاستمرار ، لا يحتاج طبقة الخدمة حتى إلى معرفة مصدر البيانات. على سبيل المثال ، إذا كنت تفكر في التحول من استخدام MySQL إلى MongoDB ، يكون كل التغييرات اللازمة في طبقة DAO فقط.
- يؤكد نمط DAO على انخراط منخفض بين مكونات التطبيق المختلفة. لذا ، طبقة العرض ليس لديها تبعية على طبقة DAO وتعتمد فقط طبقة الخدمة عليها ، حتى مع الواجهات وليس من التنفيذ المحدد.
- نظرًا لأن منطق الاستمرار منفصل تمامًا ، فإنه من السهل جدًا كتابة اختبارات وحدية لمكونات الفردية. على سبيل المثال ، إذا كنت تستخدم JUnit و Mockito كأطُر اختبار ، سيكون من السهل محاكاة مكونات تطبيقك الفردية.
- نظرًا لأننا نعمل مع واجهات في نمط DAO ، يؤكد أيضًا على أسلوب “العمل مع الواجهات بدلاً من التنفيذ” الذي هو أسلوب برمجة ممتاز في البرمجة الشيئية.
استنتاج نمط DAO
في هذا المقال، تعلمنا كيف يمكننا استخدام نمط تصميم DAO للتأكيد على فصل منطق البقاء على قيد الحياة وبالتالي، تفكيك مكوناتنا بشكل فضفاض. تعتمد أنماط التصميم فقط على طريقة البرمجة وبالتالي، مستقلة عن اللغة والإطار. لا تتردد في ترك آرائك في التعليقات أدناه. قم بتنزيل مشروع المثال DAO من الرابط أدناه.
المراجع: توثيق أوراكل، ويكيبيديا.
Source:
https://www.digitalocean.com/community/tutorials/dao-design-pattern