Saya menyertakan tabel hierarki enkapsulasi dari beberapa pola desain GoF untuk membantu menjelaskan perbedaan antara kedua pola ini. Semoga lebih baik menggambarkan apa yang masing-masing merangkum sehingga penjelasan saya lebih masuk akal.
Pertama, hierarki mencantumkan cakupan yang menerapkan pola tertentu, atau pola yang sesuai untuk digunakan untuk merangkum beberapa tingkat detail, bergantung pada sisi tabel mana Anda memulai.
Seperti yang Anda lihat dari tabel, objek Pola Strategi menyembunyikan detail implementasi algoritme, sehingga penggunaan objek strategi yang berbeda akan menjalankan fungsi yang sama tetapi dengan cara yang berbeda. Setiap objek strategi mungkin dioptimalkan untuk faktor tertentu atau beroperasi pada beberapa parameter lain; dan, melalui penggunaan antarmuka umum, konteks dapat bekerja dengan aman.
Pola Perintah merangkum tingkat detail yang jauh lebih kecil daripada algoritme. Ini mengkodekan detail yang diperlukan untuk mengirim pesan ke objek: penerima, pemilih, dan argumen. Manfaat untuk mengobjektifikasi bagian kecil dari eksekusi proses adalah bahwa pesan semacam itu dapat dipanggil di sepanjang titik waktu atau lokasi yang berbeda secara umum tanpa harus membuat kode keras detailnya. Ini memungkinkan pesan dipanggil satu kali atau lebih, atau diteruskan ke berbagai bagian sistem atau beberapa sistem tanpa memerlukan detail permintaan tertentu untuk diketahui sebelum eksekusi.
Seperti tipikal untuk pola desain, mereka tidak mengharuskan semua implementasi identik secara detail untuk menggunakan nama pola. Detail dapat bervariasi dalam penerapannya dan dalam data apa yang dikodekan dalam objek versus sebagai argumen metode.
Strategi merangkum algoritma. Perintah memisahkan pengirim dari penerima permintaan, mereka mengubah permintaan menjadi objek.
Jika itu algoritma, bagaimana sesuatu akan dilakukan, gunakan Strategi. Jika Anda perlu memisahkan panggilan metode dari eksekusinya, gunakan Command. Perintah sering digunakan saat Anda mengantri pesan untuk digunakan nanti, seperti tugas atau transaksi.
sumber
Menjawab pertanyaan yang sangat lama. (apakah ada yang melihat jawaban terbaru, bukan yang paling banyak dipilih?)
Ini adalah kebingungan yang valid karena kesamaannya. Baik pola Strategi dan Perintah menggunakan enkapsulasi . Tapi itu tidak membuat mereka sama.
Perbedaan utamanya adalah memahami apa yang dienkapsulasi. Prinsip OO, kedua pola bergantung pada, adalah Enkapsulasi apa yang bervariasi .
Dalam hal strategi, yang bervariasi adalah algoritma . Misalnya, satu objek strategi mengetahui cara mengeluarkan ke file XML, sedangkan yang lainnya menghasilkan, katakanlah, JSON. Algoritme yang berbeda disimpan ( dienkapsulasi ) di kelas yang berbeda. Sesederhana itu.
Dalam hal perintah, yang bervariasi adalah permintaan itu sendiri. Permintaan mungkin datang dari
File Menu > Delete
atauRight Click > Context Menu > Delete
atauJust Delete Button pressed
. Ketiga kasus tersebut dapat menghasilkan 3 objek perintah dengan tipe yang sama. Objek perintah ini hanya mewakili 3 permintaan penghapusan; bukan algoritma penghapusan. Karena permintaan adalah sekumpulan objek sekarang, kami dapat mengelolanya dengan mudah. Tiba-tiba, menyediakan fungsionalitas seperti urung atau ulangi menjadi hal yang sepele.Tidak peduli bagaimana perintah mengimplementasikan logika yang diminta. Saat memanggil execute (), ia dapat mengimplementasikan algoritma untuk memicu penghapusan atau bahkan dapat mendelegasikannya ke objek lain, bahkan dapat mendelegasikannya ke strategi. Ini hanya detail implementasi dari pola perintah. Inilah sebabnya mengapa ini dinamai sebagai perintah meskipun ini bukan cara yang sopan untuk meminta : -)
Bandingkan dengan strategi; pola ini hanya berkaitan dengan logika aktual yang dieksekusi. Jika kita melakukan itu, akan membantu untuk mencapai kombinasi perilaku yang berbeda dengan sekumpulan kelas minimal, sehingga mencegah ledakan kelas.
Saya pikir, Command membantu kita untuk memperluas pemahaman kita tentang enkapsulasi sementara Strategi menyediakan penggunaan enkapsulasi dan polimorfisme secara alami.
sumber
Cara saya melihatnya adalah Anda memiliki beberapa cara untuk melakukan hal yang sama, masing-masing adalah strategi, dan sesuatu pada waktu proses menentukan strategi mana yang akan dieksekusi.
Mungkin coba dulu StrategyOne, jika hasilnya kurang bagus, coba StrategyTwo ...
Perintah terikat pada hal-hal berbeda yang perlu terjadi seperti TryToWalkAcrossTheRoomCommand. Perintah ini akan ditembakkan setiap kali ada objek yang mencoba berjalan melintasi ruangan, tetapi di dalamnya, mungkin mencoba StrategyOne dan StrategyTwo untuk mencoba berjalan melintasi ruangan.
Menandai
sumber
Saya mungkin salah menurut pendapat saya, tetapi saya memperlakukan perintah sebagai fungsi untuk mengeksekusi, atau reaksi. Setidaknya harus ada dua pemain: orang yang meminta tindakan, dan orang yang menjalankan tindakan. GUI adalah contoh tipikal untuk pola perintah:
Perintah biasanya dibatasi ke beberapa ruang lingkup atau area bisnis, tetapi tidak perlu: Anda mungkin memiliki perintah yang mengeluarkan tagihan, memulai roket atau menghapus file yang menerapkan antarmuka yang sama (misalnya
execute()
metode tunggal ) dalam satu aplikasi. Seringkali perintah bersifat mandiri, sehingga mereka tidak memerlukan apa pun dari pelaksana untuk memproses tugas yang mereka inginkan (semua informasi yang diperlukan diberikan pada waktu konstruksi), terkadang perintah peka konteks dan harus dapat menemukan konteks ini ( Backspace perintah harus tahu posisi tanda sisipan dalam teks untuk benar menghapus karakter sebelumnya; rollback perintah harus menemukan transaksi saat ini untuk rollback; ...).The strategi adalah berbeda sedikit: itu lebih terikat untuk beberapa daerah. Strategi ini dapat menetapkan aturan untuk memformat tanggal (dalam UTC? Spesifik lokal?) (Strategi "pemformat tanggal") atau untuk menghitung persegi untuk figur geometris (strategi "kalkulator persegi"). Strategi dalam pengertian ini objek kelas terbang, yang mengambil sesuatu sebagai masukan ("tanggal", "gambar", ...) dan membuat beberapa keputusan berdasarkan itu. Mungkin bukan yang terbaik, tetapi contoh strategi yang baik adalah yang terhubung dengan
javax.xml.transform.Source
antarmuka: tergantung pada apakah objek yang dilewati adalahDOMSource
atauSAXSource
atauStreamSource
strategi (= transformator XSLT dalam kasus ini) akan menerapkan aturan yang berbeda untuk memprosesnya. Penerapannya bisa sederhanaswitch
atau melibatkan pola Rantai tanggung jawab .Tapi memang ada kesamaan antara dua pola ini: perintah dan strategi merangkum algoritma dalam area semantik yang sama.
sumber
Perintah:
Komponen dasar:
execute()
Alur Kerja:
Klien memanggil Invoker => Invoker memanggil ConcreteCommand => ConcreteCommand memanggil metode Penerima , yang mengimplementasikan metode Perintah abstrak .
Keuntungan : Klien tidak terpengaruh perubahan Command dan Receiver. Invoker menyediakan kopling longgar antara Klien dan Penerima. Anda dapat menjalankan banyak perintah dengan Invoker yang sama.
Pola perintah memungkinkan Anda untuk menjalankan perintah pada Penerima yang berbedadengan menggunakan Invoker yang sama. Invoker tidak mengetahui jenis Penerima
Untuk pemahaman konsep yang lebih baik, lihat artikel JournalDev ini oleh Pankaj Kumar dan artikel dzone oleh James Sugrue di samping tautan Wikipedia.
Anda dapat menggunakan pola Perintah untuk
Pisahkan pemanggil & penerima perintah
Terapkan mekanisme callback
Menerapkan fungsi undo dan redo
Pertahankan riwayat perintah
java.lang.Thread
adalah salah satu implementasi yang baik dari pola Command . Anda dapat memperlakukan Thread sebagai invoker & class yang mengimplementasikan Runnable sebagai ConcreteCommonad / Receiver danrun()
metode sebagai Command .Versi Undo / Redo dari pola perintah dapat dibaca di artikel Theodore Norvell
Strategi:
Pola strategi sangat sederhana untuk dipahami. Gunakan pola ini saat
Anda memiliki beberapa implementasi untuk suatu algoritme dan implementasi algoritme dapat berubah pada waktu proses bergantung pada kondisi tertentu .
Ambil contoh komponen Tarif sistem pemesanan Maskapai
Maskapai ingin menawarkan Tarif yang berbeda selama periode waktu yang berbeda - bulan Peak dan Off Peak. Selama hari-hari perjalanan Off peak, kami ingin merangsang permintaan dengan menawarkan diskon menarik.
Poin utama dari pola Strategi :
Posting terkait dengan contoh kode:
Menggunakan pola Desain Perintah
Contoh Pola Strategi Dunia Nyata
sumber
Bagi saya, perbedaan adalah salah satu niat. Penerapan kedua pola ini sangat mirip, tetapi memiliki tujuan yang berbeda:
Untuk Strategi, komponen yang menggunakan objek mengetahui apa yang dilakukan objek (dan akan menggunakannya untuk melakukan sebagian dari pekerjaannya sendiri), tetapi tidak peduli bagaimana cara melakukannya.
Untuk sebuah Command, komponen yang menggunakan objek tidak mengetahui apa yang dilakukan Command atau bagaimana cara melakukannya - hanya tahu cara memanggilnya. Tugas pemanggil hanyalah menjalankan perintah - pemrosesan yang dilakukan oleh Perintah tidak menjadi bagian dari pekerjaan inti pemanggil.
Inilah perbedaannya - apakah objek yang menggunakan komponen benar-benar mengetahui atau peduli tentang fungsi komponen? Seringkali ini dapat ditentukan berdasarkan apakah objek pola mengembalikan nilai ke invokernya. Jika invoker peduli tentang apa yang dilakukan objek pola maka ia mungkin ingin mengembalikan sesuatu dan itu akan menjadi Strategi. Jika tidak peduli dengan nilai yang dikembalikan, mungkin itu adalah Perintah (perhatikan, sesuatu seperti Java Callable masih merupakan Perintah karena, meskipun mengembalikan nilai, pemanggil tidak peduli dengan nilainya - ia hanya meneruskannya kembali untuk apa pun yang awalnya menyediakan Command).
sumber