Saya telah membaca tentang prinsipal OCP dan bagaimana menggunakan pola strategi untuk mencapai hal ini.
Saya akan mencoba dan menjelaskan hal ini kepada beberapa orang, tetapi satu-satunya contoh yang dapat saya pikirkan adalah menggunakan kelas validasi yang berbeda berdasarkan pada status "pesanan".
Saya telah membaca beberapa artikel online, tetapi ini biasanya tidak menggambarkan alasan yang nyata untuk menggunakan strategi, seperti menghasilkan laporan / tagihan / validasi dll ...
Apakah ada contoh dunia nyata yang menurut Anda pola strategi biasa?
sumber
Cipher C =null; if (file.size() <= 2048) { C = new InMemoryCipherStrategy(); } else { c= SwaptToDiskCipher (); }
CipherFactory
mungkin membingungkan mereka yang tidak terbiasa dengan pola Strategi.Sekali lagi, posting lama tetapi masih muncul di pencarian jadi saya akan menambahkan dua contoh lagi (Kode ada di C #). Saya benar-benar menyukai pola Strategi karena telah menghemat banyak waktu saya ketika manajer proyek mengatakan: "Kami ingin aplikasi melakukan 'X', tetapi 'X' belum jelas dan dapat berubah dalam waktu dekat. " Video ini menjelaskan pola strategi , menggunakan StarCraft sebagai contoh.
Barang-barang yang termasuk dalam kategori ini:
Penyortiran: Kami ingin menyortir nomor ini, tetapi kami tidak tahu apakah kami akan menggunakan BrickSort, BubbleSort, atau penyortiran lainnya
Validasi: Kami perlu memeriksa item sesuai dengan "Beberapa aturan", tetapi belum jelas aturan apa itu nantinya, dan kami mungkin memikirkan yang baru.
Permainan: Kami ingin pemain berjalan atau berlari saat dia bergerak, tapi mungkin di masa depan, dia juga harus bisa berenang, terbang, teleportasi, menggali di bawah tanah, dll.
Menyimpan informasi: Kami ingin aplikasi menyimpan informasi ke Database, tetapi nanti mungkin perlu untuk menyimpan file, atau membuat panggilan web
Keluaran: Kita perlu mengeluarkan X sebagai string biasa, tapi nanti mungkin CSV, XML, JSON, dll.
Contoh
Saya memiliki proyek di mana pengguna dapat menetapkan produk ke orang di database. Penetapan produk kepada seseorang ini memiliki status "Disetujui" atau "Ditolak", yang bergantung pada beberapa aturan bisnis. Misalnya: jika pengguna memberikan produk kepada seseorang dengan usia tertentu, statusnya harus ditolak; Jika perbedaan antara dua bidang dalam item lebih besar dari 50, statusnya ditolak, dll.
Sekarang, pada saat perkembangan aturan bisnis ini belum sepenuhnya jelas, dan aturan baru dapat muncul kapan saja. Kekuatan dari stragety-pattern adalah saya membuat RuleAgent, yang diberi daftar IRules.
Pada saat menugaskan produk ke seseorang, saya membuat RuleAgent, memberinya daftar aturan (yang semuanya menerapkan IRule), dan memintanya untuk memvalidasi tugas. Ini akan berjalan melalui semua aturannya. Yang mana, karena mereka semua mengimplementasikan antarmuka yang sama, semua memiliki
IsApproved
metode dan mengembalikan false jika ada yang mengembalikan false.Sekarang ketika misalnya manajer tiba-tiba muncul dan berkata, kami juga perlu menolak semua tugas untuk magang, atau semua tugas untuk orang yang bekerja lembur ... Anda membuat kelas baru seperti ini:
Anda melihat bahwa Anda tidak perlu terus menambahkan atau menghapus if-statement atau code, cukup buat kelas aturan baru yang mengimplementasikan antarmuka IRUle dan ganti jika diperlukan.
Contoh bagus lainnya: serial video Scott Allen di http://www.asp.net/mvc/pluralsight mana dia menggunakan pola strategi di bagian Uji-unit aplikasi
Ia membangun situs web yang memiliki halaman yang menampilkan item berdasarkan popularitas. Namun, "Populer" bisa berarti banyak hal (sebagian besar penayangan, sebagian besar pelanggan, tanggal pembuatan, aktivitas terbanyak, jumlah komentar paling sedikit, dll.), Dan jika manajemen belum tahu persis bagaimana cara memesan, dan mungkin ingin bereksperimen dengan yang berbeda memesan di kemudian hari. Anda membuat antarmuka (IOrderAlgorithm atau sesuatu) dengan metode pemesanan, dan biarkan objek Orderer mendelegasikan pengurutan untuk implementasi konkret dari antarmuka IOrderAlgorithm. Anda dapat membuat "CommentOrderer", "ActivityOrderer", dll ... Dan cukup ganti ini ketika persyaratan baru muncul.
sumber
InternRule
sekarang tetapi bagaimana kami memicuOvertimeRule
? Bagaimana kita memastikan bahwa logika apa pun yang dipanggilOvertimeRule.IsApproved
sekarang juga memanggilInternRule.IsApproved
?Catatan kunci:
Strategi adalah pola desain perilaku. Ini digunakan untuk beralih di antara keluarga algoritme.
Pola ini berisi satu antarmuka strategi abstrak dan banyak implementasi strategi konkret ( algoritme ) dari antarmuka itu.
Aplikasi hanya menggunakan antarmuka strategi . Bergantung pada beberapa parameter konfigurasi, strategi konkret akan diberi tag ke antarmuka .
Diagram UML dari wikipedia
Satu contoh nyata: Maskapai yang menawarkan diskon selama beberapa bulan (Juli-Desember) . Anda dapat memiliki satu modul Tarif , yang menentukan opsi harga tergantung pada nomor bulan.
Lihat contoh sederhana. Contoh ini dapat diperluas ke aplikasi ritel online, yang memberikan diskon untuk item keranjang belanja pada hari-hari khusus / happy hour dengan mudah.
keluaran:
Artikel yang berguna:
pola strategi oleh dzone
pola strategi dengan pembuatan sumber
sumber
Saya dapat memikirkan beberapa contoh yang cukup sederhana:
Kompresi data. Anda mungkin memiliki antarmuka ICompressor yang satu-satunya metode terlihat seperti ini:
byte [] kompres (input byte []);
Kelas kompresi konkret Anda mungkin seperti RunLengthCompression, DeflateCompression, dll.
sumber
Salah satu penggunaan umum dari pola strategi adalah untuk menentukan strategi penyortiran kustom (dalam bahasa tanpa fungsi tingkat tinggi), misalnya untuk mengurutkan daftar string berdasarkan panjangnya di Java, meneruskan kelas dalam anonim (implementasi antarmuka strategi):
Dengan cara yang sama, strategi dapat digunakan untuk kueri asli dengan database objek, misalnya di db4o:
sumber
Saya memiliki aplikasi yang menyinkronkan basis penggunanya setiap hari dengan direktori perusahaan kami. Pengguna memenuhi syarat atau tidak memenuhi syarat berdasarkan status mereka di Universitas. Setiap hari program penyediaan berjalan dan memastikan bahwa mereka yang seharusnya memenuhi syarat disediakan dalam aplikasi dan mereka yang tidak dicabut (sebenarnya sesuai dengan algoritma degradasi yang anggun, tapi itu bukan intinya). Pada hari Sabtu saya melakukan pembaruan yang lebih menyeluruh yang menyinkronkan beberapa properti dari setiap pengguna serta memastikan bahwa mereka memiliki kelayakan yang sesuai. Di akhir bulan saya melakukan beberapa pemrosesan tagihan kembali berdasarkan penggunaan untuk bulan itu.
Saya menggunakan pola strategi yang dapat disusun untuk melakukan sinkronisasi ini. Program utama pada dasarnya memilih strategi master tergantung pada hari dalam seminggu (hanya sinkronkan perubahan / sinkronkan semua) dan waktu semester relatif terhadap kalender akademik. Jika siklus penagihan berakhir, maka itu juga menyusunnya dengan strategi penagihan. Kemudian menjalankan strategi yang dipilih melalui antarmuka standar.
Saya tidak tahu seberapa umum hal ini, tetapi saya merasa ini sangat cocok untuk pola strategi.
sumber
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 menyimpanC
, tetapi biarkan apa pun yang telah dikirim keA
. 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.
Jadi saya sekarang memiliki dua strategi berbeda: satu adalah
QuitterStrategy
(yang berhenti pada kesalahan pertama dan tidak membersihkan apa-apa) dan yang lainnya adalahMaximizeDeliveryToAStrategy
(yang berusaha semaksimal mungkin untuk tidak membatalkan proses dan tidak pernah mengembalikan barang yang dikirim ke penyimpananA
, tetapi rollback barang dariB
jika pengirimanC
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.
sumber
Pola strategi adalah pola yang paling umum digunakan khusus untuk validasi dan algoritma pengurutan.
Izinkan saya menjelaskan dengan contoh praktis sederhana
Kode tes untuk ini adalah
Contoh yang sama diambil dari http://coder2design.com/strategy-pattern/
sumber
Contoh pola strategi yang baik adalah dalam permainan di mana kita dapat memiliki karakter yang berbeda dan setiap karakter dapat memiliki banyak senjata untuk diserang tetapi dalam satu waktu hanya dapat menggunakan satu senjata. Jadi kita memiliki karakter sebagai konteksnya, misalnya Raja, Komandan, Ksatria, Prajurit dan senjata sebagai strategi di mana serangan () bisa menjadi metode / algoritma yang bergantung pada senjata yang digunakan. Jadi jika kelas senjata beton adalah Sword, Axe, Crossbow, BowAndArrow dll .. mereka semua akan menerapkan metode attack (). Saya yakin penjelasan lebih lanjut tidak diperlukan.
sumber
Saya menggunakan pendekatan strategi di mesin yang cukup kompleks dalam aplikasi yang merupakan contoh yang baik. Pada dasarnya peran mesin adalah pergi dan pertama-tama menemukan daftar orang yang memiliki widget, peran kedua adalah untuk mencari tahu 10 orang terbaik dengan widget berdasarkan jumlah parameter yang tidak diketahui (hal-hal seperti jarak harga bisnis sebelumnya bersama-sama , jumlah stok, opsi pengiriman, dll dll ...)
Pada dasarnya apa yang kami lakukan adalah kami memecahkan masalah menjadi dua strategi yang pertama adalah pengambilan data, karena kami tahu bahwa kami memiliki banyak sumber widget dan kami harus bisa mendapatkan data dan mengubahnya menjadi struktur umum.
Kami kemudian juga menyadari bahwa kami memiliki beberapa algoritme beberapa didasarkan pada pembobotan parameter, yang lain sangat aneh dan menguntungkan dan saya tidak dapat melakukannya dengan adil tanpa mengeluarkan visios dan bagan dan Anda mendapatkan gambarannya, kami memiliki banyak algoritme untuk memilih orang terbaik.
Layanan kami sendiri pada dasarnya mendefinisikan input, output dan melakukan beberapa normalisasi data, itu juga menggunakan pola penyedia untuk plug-in penyedia data spesifik aplikasi dan penyedia algoritma yang menggunakan strategi tersebut. Ini adalah sistem yang cukup efektif.
Kami mengalami beberapa perdebatan jika kami menggunakan strategi atau pola template yang tidak pernah kami selesaikan.
sumber
Apakah Anda yakin bahwa status "pesanan" bukanlah pola Negara Bagian? Saya memiliki firasat bahwa pesanan tidak akan ditangani secara berbeda tergantung pada statusnya.
Ambil contoh metode Kirim pada Pesanan:
Contoh terbaik dari pola keadaan (dan pola lainnya) yang saya temukan ada di buku " Pola Desain Kepala Pertama ", yang luar biasa. Yang kedua adalah rangkaian pola blog David Cumps .
sumber
Misalkan Anda ingin menulis algoritme untuk menghitung hari ke-X pada bulan dan tahun tertentu, misalnya, Senin kedua bulan Oktober 2014. Anda ingin menggunakan kelas Waktu Android
android.text.format.Time
untuk merepresentasikan tanggal, tetapi Anda juga ingin menulis algoritme umum yang juga dapat diterapkan kejava.util.Calendar
.Inilah yang saya lakukan.
Di DatetimeMath.java:
Di TimeMath.java:
Di OrdinalDayOfWeekCalculator.java, kelas dengan algoritme umum:
Di aplikasi Android saya, saya akan memanggil sesuatu seperti
Jika saya ingin menggunakan kembali algoritme yang sama
java.util.Calendar
, saya hanya akan menulis kelas CalendarMath yang mengimplementasikan tiga metode di DatetimeMath dan kemudian menggunakansumber
sumber
Beberapa minggu yang lalu, saya menambahkan antarmuka Java umum yang diimplementasikan oleh salah satu objek domain kami. Objek domain ini dimuat dari database, dan representasi database adalah skema bintang dengan sekitar 10+ cabang. Salah satu konsekuensi dari memiliki objek domain yang sangat berat adalah kami harus membuat objek domain lain yang mewakili skema yang sama, meskipun bobotnya lebih ringan. Jadi saya membuat objek ringan lainnya menerapkan antarmuka yang sama. Jika tidak, kami memiliki:
Awalnya, saya ingin menggunakan
CollectibleElephant
untuk mengurutkanElephant
s. Cukup cepat, rekan satu tim sayaCollectibleElephant
dengan senang hati menjalankan pemeriksaan keamanan, memfilter mereka saat dikirim ke GUI, dll.sumber
Kami harus membuat antarmuka penyediaan pihak ketiga untuk platform perusahaan dengan database yang sangat rumit. Pengiriman data yang akan disediakan adalah sebagai daftar tipe data kami yang dimasukkan ke dalam antrian prioritas dalam aplikasi kami sehingga dapat ditulis ke database dalam urutan yang benar karena ketergantungan.
Proses untuk menulis data tersebut kemudian cukup sederhana, tetap muncul di atas antrian prioritas dan kemudian pilih strategi berdasarkan jenis objek yang Anda ekstrak.
sumber
Dari wikipedia
Dalam aplikasi Windows Paint Anda dapat melihat pola strategi di mana Anda dapat memilih bentuk dan warna secara terpisah di bagian yang berbeda. Di sini bentuk dan warna adalah algoritma yang dapat diubah saat runtime.
Jika Anda ingin menggambar lingkaran dengan warna merah, daripada memberikan pilihan 'RedCircle' mereka membiarkan Anda memilih lingkaran dan warna pilihan Anda.
Tanpa pola strategi akan menambah jumlah kelas dengan produk Cartesian berupa bentuk dan warna. Juga antarmuka berubah untuk setiap implementasi.
sumber
Bayangkan game penembak dengan musuh AI misalnya. Anda ingin mereka terus berjuang dengan cara yang berbeda berdasarkan apa yang terjadi .. Dengan pola strategi, Anda dapat terus berputar dan secara dinamis mengubah cara suatu tindakan atau tindakan akan dilakukan.
sumber