Saya tahu ini adalah pertanyaan lama, tapi saya rasa saya memiliki contoh menarik lain yang saya terapkan baru-baru ini.
Ini adalah contoh yang sangat praktis dari pola strategi yang digunakan dalam sistem pengiriman dokumen.
Saya memiliki sistem pengiriman PDF yang menerima arsip yang berisi banyak dokumen dan beberapa metadata. Berdasarkan metadata, diputuskan di mana harus meletakkan dokumen; katakanlah, tergantung pada data, saya bisa menyimpan dokumen dalam A
, B
atauC
sistem penyimpanan, atau campuran dari tiga.
Pelanggan yang berbeda menggunakan sistem ini, dan mereka memiliki persyaratan penanganan rollback / error yang berbeda jika terjadi kesalahan: seseorang ingin sistem pengiriman berhenti pada kesalahan pertama, membiarkan semua dokumen yang sudah terkirim di penyimpanan mereka, tetapi menghentikan proses dan tidak mengirimkan yang lain ; yang lain ingin mengembalikannya B
jika terjadi kesalahan saat menyimpan C
, tetapi biarkan apa pun yang telah dikirim ke A
. Mudah untuk membayangkan bahwa yang ketiga atau keempat juga memiliki kebutuhan yang berbeda.
Untuk mengatasi masalah ini, saya telah membuat kelas pengiriman dasar yang berisi logika pengiriman, ditambah metode untuk mengembalikan barang dari semua penyimpanan. Metode tersebut sebenarnya tidak dipanggil oleh sistem pengiriman secara langsung jika terjadi kesalahan. Sebaliknya, kelas tersebut menggunakan Injeksi Ketergantungan untuk menerima kelas "Strategi Penanganan Rollback / Error" (berdasarkan pelanggan yang menggunakan sistem), yang dipanggil jika terjadi kesalahan, yang pada gilirannya akan memanggil metode rollback jika sesuai untuk strategi itu.
Kelas pengiriman itu sendiri melaporkan apa yang terjadi pada kelas strategi (dokumen apa yang dikirim ke penyimpanan apa, dan kegagalan apa yang terjadi), dan setiap kali terjadi kesalahan, ia menanyakan strategi apakah akan melanjutkan atau tidak. Jika strategi mengatakan "hentikan", kelas akan memanggil metode "pembersihan" strategi, yang menggunakan informasi yang dilaporkan sebelumnya untuk memutuskan metode rollback mana yang akan dipanggil dari kelas pengiriman, atau tidak melakukan apa pun.
rollbackStrategy.reportSuccessA(...);
rollbackStrategy.reportFailureB(...);
if (rollbackStrategy.mustAbort()) {
rollbackStrategy.rollback(); // rollback whatever is needed based on reports
return false;
}
Jadi saya sekarang memiliki dua strategi berbeda: satu adalah QuitterStrategy
(yang berhenti pada kesalahan pertama dan tidak membersihkan apa-apa) dan yang lainnya adalah MaximizeDeliveryToAStrategy
(yang berusaha semaksimal mungkin untuk tidak membatalkan proses dan tidak pernah mengembalikan barang yang dikirim ke penyimpanan A
, tetapi rollback barang dari B
jika pengiriman C
gagal).
Dari pemahaman saya, inilah salah satu contoh pola strategi. Jika Anda (ya, Anda membaca) merasa saya salah, beri komentar di bawah dan beri tahu saya. Saya ingin tahu tentang apa yang merupakan penggunaan pola strategi yang "murni", dan aspek penerapan apa yang melanggar definisi tersebut. Saya rasa ini terlihat agak lucu karena antarmuka strateginya agak gemuk. Semua contoh yang saya lihat sejauh ini hanya menggunakan satu metode, tetapi saya masih berpikir ini merangkum algoritma (jika sepotong logika bisnis dapat dianggap sebagai algoritma, yang menurut saya memang demikian).
Karena strategi juga diberitahukan tentang peristiwa selama pelaksanaan pengiriman, itu juga dapat dianggap sebagai Pengamat , tapi itu cerita lain.
Dari melakukan sedikit riset, sepertinya ini adalah "pola komposit" (seperti MVC, pola yang menggunakan beberapa pola desain di bawahnya dengan cara tertentu) yang disebut Advisor . Ini adalah penasihat tentang apakah pengiriman harus dilanjutkan atau tidak, tetapi ini juga merupakan penangan kesalahan aktif karena dapat mengembalikan barang ketika diminta.
Bagaimanapun, ini adalah contoh yang cukup kompleks yang mungkin membuat perasaan Anda bahwa penggunaan pola strategi terlalu sederhana / konyol. Ini bisa sangat kompleks dan bahkan lebih dapat diterapkan bila digunakan bersama dengan pola lain.