Definisi: Merangkum permintaan ke dalam suatu objek, memungkinkan Anda untuk parameterisasi klien menggunakan permintaan yang berbeda, permintaan antrian atau merekam log permintaan, dan memberikan fungsi pencabutan dan pemulihan perintah.
Jenis: Pola perilaku
Diagram kelas:
Struktur mode perintah
Seperti namanya, mode perintah adalah enkapsulasi perintah. Pertama, mari kita lihat struktur dasar dalam diagram kelas mode perintah:
Kelas Perintah: adalah kelas abstrak yang menyatakan perintah yang perlu dieksekusi. Secara umum, metode eksekusi harus dipublikasikan kepada publik untuk menjalankan perintah.
Kelas Concretecommand: Kelas implementasi kelas perintah, mengimplementasikan metode yang dinyatakan dalam kelas abstrak.
Kelas Klien: Kelas Panggilan Klien Terakhir.
Fungsi dari tiga kelas di atas harus lebih mudah dipahami. Mari kita fokus pada kelas Invoker dan kelas Recevier.
Kelas Invoker: Penelepon bertanggung jawab untuk memohon perintah.
Kelas Penerima: Penerima bertanggung jawab untuk menerima dan melaksanakan perintah.
Terus terang, yang disebut enkapsulasi perintah tidak lebih dari menulis serangkaian operasi ke dalam metode dan kemudian dipanggil oleh klien. Ini tercermin pada diagram kelas. Hanya dibutuhkan kelas ConCretecommand dan kelas klien untuk menyelesaikan enkapsulasi perintah. Bahkan jika melangkah lebih jauh, untuk meningkatkan fleksibilitas, kelas perintah dapat ditambahkan untuk abstraksi yang sesuai. Apa fungsi penelepon dan penerima ini?
Bahkan, Anda dapat berpikir dari perspektif lain: jika Anda hanya merangkum beberapa operasi sebagai perintah untuk dihubungi orang lain, bagaimana bisa disebut pola? Sebagai model perilaku, mode perintah harus terlebih dahulu mencapai kopling rendah. Hanya ketika derajat kopling rendah fleksibilitas dapat ditingkatkan. Tujuan menambahkan peran penelepon dan penerima justru untuk ini.
contoh:
Simulasi pengoperasian TV mencakup perintah power-on, shutdown, dan perubahan. Kodenya adalah sebagai berikut
// antarmuka untuk mengeksekusi perintah antarmuka publik perintah {void execute (); } // Penerima Perintah Penerima Kelas Publik TV {public int currentChannel = 0; public void turnon () {System.out.println ("Televisino aktif."); } public void turnoff () {System.out.println ("Televisi tidak aktif."); } public void changeChannel (saluran int) {this.currentchannel = channel; System.out.println ("Sekarang saluran TV adalah" + saluran); }} // tutup perintah concreteCommand commandOn kelas publik mengimplementasikan perintah {private tv mytv; Public Commandon (TV TV) {mytv = TV; } public void execute () {mytv.turnon (); }} // tutup perintah concretecommand commandoff kelas publik mengimplementasikan perintah {private tv mytv; Public Commandoff (TV TV) {mytv = TV; } public void execute () {mytv.turnoff (); }} // Command switching saluran CONCRTECOMMAND CommandChange PublicChange mengimplementasikan perintah {private tv mytv; saluran int private; Public CommandChange (TV TV, saluran int) {mytv = TV; this.channel = saluran; } public void execute () {mytv.changechannel (saluran); }} // Ini dapat dianggap sebagai kontrol kelas publik Remote Control Invoker {Private Command OnCommand, OffCommand, ChangeChannel; Kontrol Publik (Perintah Aktif, Perintah Off, Command Channel) {OnCommand = on; OffCommand = OFF; changechannel = saluran; } public void turnon () {onCommand.execute (); } public void turnoff () {offcommand.execute (); } public void changeChanNel () {changechannel.execute (); }} // Test Class Client Public Class Client {public static void main (string [] args) {// perintah penerima penerima tv mytv = tv baru (); // perintah power-on concretecommond commandon on = new commandon (mytv); // perintah shutdown concretecommond commandoff off = new commandoff (mytv); // Saluran Perintah CONCRTECOMMONM CommandChange Channel = new CommandChange (mytv, 2); // Kontrol Kontrol Perintah Kontrol Kontrol Invoker = Kontrol Baru (ON, OFF, Channel); // power-on control.turnon (); // switch channel control.changechannel (); // Matikan Control.Turnoff (); }}Hasil eksekusi
Televisino menyala. Sekarang saluran TV adalah 2 televisi tidak aktif.
Keuntungan dan Kekurangan Mode Perintah
Pertama -tama, mode perintah sangat enkapsulasi: setiap perintah dienkapsulasi, dan untuk klien, perintah yang sesuai disebut sebanyak fungsi yang diperlukan tanpa mengetahui bagaimana perintah dieksekusi. Misalnya, ada satu set perintah operasi file: Buat file baru, salin file, dan hapus file. Jika ketiga operasi ini dienkapsulasi ke dalam kelas perintah, klien hanya perlu tahu bahwa ada ketiga kelas perintah ini. Adapun logika yang dienkapsulasi di kelas perintah, klien tidak perlu tahu.
Kedua, mode perintah memiliki skalabilitas yang baik. Dalam mode perintah, enkapsulasi operasi paling dasar di kelas penerima, dan enkapsulasi sekunder kelas perintah dari operasi dasar ini. Saat menambahkan perintah baru, penulisan kelas perintah umumnya tidak dari awal. Ada sejumlah besar kelas penerima untuk panggilan, dan ada juga sejumlah besar kelas perintah untuk panggilan, dan kodenya sangat dapat digunakan kembali. Misalnya, dalam pengoperasian file, kita perlu menambahkan perintah untuk memotong file, dan kita hanya perlu menggabungkan dua perintah menyalin file dan menghapus file, yang sangat nyaman.
Akhirnya, mari kita bicara tentang kelemahan dari mode perintah, yaitu, jika ada banyak perintah, itu akan menjadi sakit kepala untuk dikembangkan. Terutama banyak perintah sederhana hanya beberapa baris kode untuk diimplementasikan. Jika Anda menggunakan mode perintah, Anda tidak perlu khawatir tentang betapa sederhananya perintah itu, Anda perlu menulis kelas perintah untuk merangkumnya.
Skenario yang berlaku untuk mode perintah
Untuk sebagian besar fungsi mode permintaan-respons, lebih cocok untuk menggunakan mode perintah. Seperti yang dikatakan definisi mode perintah, mode perintah lebih nyaman untuk mengimplementasikan fungsi seperti logging dan membatalkan operasi.
Meringkaskan
Apakah menggunakan mode dalam suatu kesempatan adalah pertanyaan yang sangat kusut untuk semua pengembang. Kadang -kadang, karena meramalkan beberapa perubahan dalam persyaratan, pola desain tertentu digunakan untuk fleksibilitas dan skalabilitas sistem, tetapi persyaratan yang dapat diperkirakan ini tidak. Sebaliknya, banyak persyaratan yang tidak terduga telah datang, menghasilkan pola desain yang digunakan memainkan peran yang berlawanan ketika memodifikasi kode, sehingga seluruh tim proyek mengeluh. Saya percaya setiap programmer telah menemukan contoh seperti itu. Oleh karena itu, berdasarkan prinsip pengembangan yang gesit, ketika kita merancang program, jika kita dapat menyelesaikannya dengan baik tanpa menggunakan pola tertentu sesuai dengan kebutuhan saat ini, maka kita tidak boleh memperkenalkannya, karena tidak sulit untuk memperkenalkan pola desain. Kita dapat melakukannya pada sistem ketika kita benar -benar membutuhkannya untuk menggunakannya dan memperkenalkan pola desain ini.
Ambil mode perintah sebagai contoh. Dalam pengembangan kami, fungsi mode respons permintaan sangat umum. Secara umum, kami akan merangkum operasi respons terhadap permintaan ke metode. Metode yang dienkapsulasi ini dapat disebut perintah, tetapi bukan mode perintah. Apakah desain ini harus dinaikkan ke ketinggian pola perlu dipertimbangkan secara terpisah, karena jika mode perintah digunakan, dua peran penelepon dan penerima harus diperkenalkan. Logika yang awalnya ditempatkan di satu tempat tersebar ke dalam tiga kategori. Saat mendesain, perlu untuk mempertimbangkan apakah biaya ini sepadan.