Menggunakan pola strategi dan pola perintah

121

Kedua pola desain merangkum algoritme dan memisahkan detail implementasi dari kelas pemanggilnya. Satu-satunya perbedaan yang dapat saya lihat adalah bahwa pola Strategi mengambil parameter untuk dieksekusi, sedangkan pola Perintah tidak.

Tampak bagi saya bahwa pola perintah memerlukan semua informasi untuk dieksekusi tersedia saat dibuat, dan ia dapat menunda pemanggilannya (mungkin sebagai bagian dari skrip).

Penentuan apa yang memandu apakah akan menggunakan satu pola atau yang lain?

Extrakun
sumber

Jawaban:

94

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.

desain tabel hierarki enkapsulasi pola

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.

Huperniketes
sumber
Jadi jika saya memiliki sistem yang memfilter hasil dengan "pipa filter" dan menggunakan delegasi sebagai filter (di mana setiap algoritme filter akan dikemas dalam suatu fungsi) apakah itu akan dianggap sebagai pola Perintah? Dalam hal ini saya melihat delegasi untuk fungsi filter menyediakan semacam kontrak untuk apa yang harus dipatuhi setiap filter dalam hal input dan output.
KTF
4
@KTF, no. Pola Perintah menggunakan objek yang memiliki sebagian besar (jika tidak semua) info yang dibutuhkan (misalnya, penerima, pemilih, argumen) untuk memanggil metode objek. Ini adalah pola sederhana yang dapat digunakan dalam pola desain lain seperti Rantai Tanggung Jawab, Pengumpulan, dan pola Saluran yang Anda gambarkan. "Jenis kontrak" yang disediakan oleh delegasi Anda adalah pola lain, Antarmuka.
Huperniketes
50

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.

Paul Rubel
sumber
yang masuk akal en.wikipedia.org/wiki/Command_Pattern klien dan pemanggil terikat, tetapi pada saat yang sama, mereka tidak tahu tentang satu sama lain!
Kalpesh Soni
26

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 > Deleteatau Right Click > Context Menu > DeleteatauJust 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.

rpattabi.dll
sumber
15

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

MStodd
sumber
2
RE: "berbagai cara untuk melakukan hal yang sama" - Tampaknya bertentangan dengan beberapa contoh umum Strategi. Khususnya yang mana ada kelas implementasi yang melakukan penjumlahan, pengurangan, perkalian, dll. Mungkin itu bukan contoh yang baik?
Joshua Davis
1
@JoshuaDavis semua "substratagies" ini adalah kasus khusus dari satu strategi: operasi aritmatika . mereka memiliki argumen yang sama (2 operan) dan menghasilkan satu nilai sebagai hasilnya. cukup banyak melakukan hal yang sama (menjadi kotak hitam) dengan cara mereka sendiri yang berbeda, tergantung pada implementasinya. jadi saya tidak melihat konflik di sini, tetapi, justru sebaliknya: contoh bagus =)
jungle_mole
7

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:

  • Semua tombol pada toolbar aplikasi dikaitkan dengan beberapa tindakan.
  • Tombol adalah pelaksana dalam kasus ini.
  • Tindakan adalah perintah dalam kasus ini.

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.Sourceantarmuka: tergantung pada apakah objek yang dilewati adalah DOMSourceatau SAXSourceatau StreamSourcestrategi (= transformator XSLT dalam kasus ini) akan menerapkan aturan yang berbeda untuk memprosesnya. Penerapannya bisa sederhana switchatau melibatkan pola Rantai tanggung jawab .

Tapi memang ada kesamaan antara dua pola ini: perintah dan strategi merangkum algoritma dalam area semantik yang sama.

dma_k
sumber
1
Saya memperlakukan perintah sebagai fungsi panggilan balik, atau reaksi. Harus ada setidaknya dua pemain: satu yang meminta tindakan, dan satu yang mengeksekusi ... - Saya mengerti apa yang Anda coba katakan, tapi saya menghindar dari menggunakan kata 'panggilan balik', karena sering kata 'callback' menyiratkan pemanggilan asynchronous dan Anda tidak perlu membuat pemanggilan asynchronous agar pola perintah dapat berguna. Contoh kasus: Microsoft Word. Klik tombol Toolbar dan penekanan tombol pintas tidak menjalankan perintah asinkron, tetapi kami dapat menghargai bagaimana pola perintah akan berguna dalam kasus ini
Jim G.
Saya setuju, meskipun seperti yang dikatakan Jim, saya akan mengedit untuk menghapus referensi ke panggilan balik.
JARC
Terima kasih, saya telah membuat beberapa ekstensi. Beri tahu saya, jika Anda setuju / tidak setuju.
dma_k
5

Perintah:

Komponen dasar:

  1. Perintah mendeklarasikan antarmuka untuk perintah abstrak sepertiexecute()
  2. Penerima tahu cara menjalankan perintah tertentu
  3. Invoker memegang ConcreteCommand , yang harus dijalankan
  4. Klien membuat ConcreteCommand dan menetapkan Receiver
  5. ConcreteCommand mendefinisikan pengikatan antara Command dan Receiver

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

  1. Pisahkan pemanggil & penerima perintah

  2. Terapkan mekanisme callback

  3. Menerapkan fungsi undo dan redo

  4. Pertahankan riwayat perintah

java.lang.Threadadalah salah satu implementasi yang baik dari pola Command . Anda dapat memperlakukan Thread sebagai invoker & class yang mengimplementasikan Runnable sebagai ConcreteCommonad / Receiver dan run()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 :

  1. Itu adalah pola perilaku
  2. Itu berdasarkan delegasi
  3. Ini mengubah nyali objek dengan memodifikasi perilaku metode
  4. Ini digunakan untuk beralih di antara keluarga algoritme
  5. Ini mengubah perilaku objek pada waktu proses

Posting terkait dengan contoh kode:

Menggunakan pola Desain Perintah

Contoh Pola Strategi Dunia Nyata

Ravindra babu
sumber
0

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).

BarrySW19
sumber