Saya bekerja dengan cara ini (Struts2 + Hibernate):
Tindakan Struts saya hanya bertanggung jawab untuk menampilkan informasi di peramban web. Tidak berpikir.
Pengguna -> Tindakan -> Layanan -> Repositori -> Akses Data
Atau:
Saya Ingin Melihat -> Cara melihat -> Apa yang Harus Dilakukan -> Cara Mendapatkan -> Di mana mendapatkan
Jadi, di lapisan pertama (tampilan) saya punya sesuatu seperti:
public String execute () {
try {
CourseService cs = new CourseService();
Course course = cs.getCourse(idCourse);
} catch (NotFoundException e) {
setMessageText("Course not found.");
} catch (Exception e) {
}
return "ok";
}
Seperti yang Anda lihat, "pandangan" saya tidak berpikir. Itu meminta layanan (untuk mengelola kursus) kursus tertentu. Layanan itu dapat melakukan banyak hal lebih banyak, seperti laporan, seraches, dan sebagainya. Hasilnya selalu berupa daftar atau objek tertentu (seperti contoh). Layanan adalah mesin nyata, menerapkan aturan dan mengakses Repositori (untuk mengelola data).
Jadi, jika saya meletakkan Layanan, Gudang, dan DAOS saya di perpustakaan yang berbeda, saya dapat menggunakannya bahkan dalam program berbasis teks, atau sistem desktop berbasis Window dengan tidak mengubah apa pun.
Layanan tahu apa yang harus dilakukan, tetapi tidak tahu bagaimana menunjukkannya. Pandangan tahu bagaimana menunjukkan, tetapi tidak tahu apa yang harus dilakukan. Sama dengan Layanan / Repositori: Layanan mengirim dan meminta data, tetapi tidak tahu di mana data itu dan bagaimana cara membawanya. Repositori "membuat" data mentah untuk membeli objek agar Layanan dapat bekerja dengannya.
Tetapi Repositori tidak tahu apa-apa tentang database. Jenis basis data (MySQL, PostgreSQL, ...) berkaitan dengan DAO.
Anda dapat mengubah DAO jika Anda ingin mengubah database dan itu tidak akan mempengaruhi lapisan atas. Anda dapat mengubah Repositori jika Anda ingin memperbarui manajemen data Anda, tetapi ini tidak boleh memengaruhi DAO dan lapisan atas. Anda dapat mengubah Layanan jika Anda ingin mengubah logika Anda, tetapi ini tidak boleh mengacaukan dengan lapisan di atas atau di bawah.
Dan Anda dapat mengubah apa pun yang terlihat, bahkan teknologi (web, desktop, teks) tetapi ini tidak boleh menyiratkan sentuhan apa pun di bawah.
Logika bisnis adalah Layanan. Tetapi cara berinteraksi dengan ini adalah dengan melihat. Tombol apa yang harus ditunjukkan sekarang? Bisakah pengguna melihat tautan ini? Pikirkan sistem Anda adalah program berbasis konsol: Anda harus menolak jika pengguna yang salah memilih #> myprogram -CourseService -option=getCourse -idCourse=234
atau menghentikannya untuk menekan tombol untuk menulis perintah ini?
Berbicara dalam sistem berbasis web (Struts + JavaEE) Saya memiliki paket pengontrol GUI terpisah. Dalam Action view saya memberikan pengguna yang dicatat dan kelas memberi saya tombol (atau elemen antarmuka yang saya inginkan).
<div id="userDetailSubBox">
<c:forEach var="actionButton" items="${actionButtons}" varStatus="id">
${actionButton.buttonCode}
</c:forEach>
</div>
Dan
private List<ActionButton> actionButtons;
Ingatlah untuk menghindari hal ini dari layanan. Ini adalah hal-hal LIHAT. Simpan di Struts Actions. Setiap interaksi antarmuka harus sepenuhnya terpisah dari kode bisnis nyata, jadi jika Anda mem-porting sistem Anda, akan mudah memotong apa yang tidak Anda perlukan lagi.