Halo semuanya, anggota Forum!
Saya (menurut saya) telah memahami polanya secara menyeluruh
Command
dan saya ingin mencoba membicarakannya “dengan kata-kata saya sendiri”.
Berdasarkan Wikipedia, kita dapat mengetahui bahwa tujuannya adalah
untuk membuat struktur di mana kelas pengirim dan kelas penerima tidak bergantung secara langsung satu sama lain. Mengorganisir panggilan balik ke kelas yang mencakup kelas pengirim . Pada prinsipnya tertulis dengan jelas dan benar, tetapi ini secara teori. Bagaimana cara melakukannya? Di sinilah permasalahan dimulai, karena... deskripsinya tidak lagi jelas dan nyata. Oleh karena itu, saya mencari tahu, saya memutuskan untuk memberi tahu Anda bagaimana saya memahaminya, mungkin bermanfaat bagi seseorang: Berdasarkan uraian tujuan pola ini, saya akan menggabungkan uraian tersebut dengan kode agar lebih jelas, Karena di Wikipedia yang sama mereka menggeneralisasikannya untuk banyak bahasa dan oleh karena itu uraiannya dipisahkan dari contoh. Ada empat istilah dalam pola ini, anggap saja saat ini: perintah (
command
), penerima perintah (
receiver
), pemanggil perintah (
invoker
) dan klien (
client
). Saya akan mengambil contoh dari Wikipedia yang sama, cukup lumayan.
Tugasnya adalah kelas
Light
yang dapat melakukan dua hal: menyalakan dan mematikan lampu. Dalam hal polanya, itu akan menjadi "penerima perintah (
receiver
)"
public class Light{
public Light(){ }
public void turnOn(){
System.out.println("The light is on");
}
public void turnOff(){
System.out.println("The light is off");
}
}
Mari kita buat antarmuka dengan satu metode
execute()
yang akan dijalankan dan dipanggil dalam pola "perintah (
command
)"
public interface Command{
void execute();
}
Hal ini diperlukan untuk merangkum pelaksanaan keterampilan kelas
Light
. Untuk melakukan ini, kita akan membuat kelas
TurnOnLightCommand
dan
TurnOffLightCommand
mengimplementasikan antarmuka
Command
dan yang akan menerima objek kelas di konstruktor
Light
. Dan masing-masing dari mereka hanya akan melakukan satu tindakan. Yang satu akan memanggil metodenya
turnOn()
, dan yang lainnya akan memanggil
turnOff()
.
public class TurnOnLightCommand implements Command{
private Light theLight;
public TurnOnLightCommand(Light light){
this.theLight=light;
}
public void execute(){
theLight.turnOn();
}
}
public class TurnOffLightCommand implements Command{
private Light theLight;
public TurnOffLightCommand(Light light){
this.theLight=light;
}
public void execute(){
theLight.turnOff();
}
}
Sekarang saatnya membuat objek yang menerima metode objek yang dienkapsulasi ini
Light
. Dari segi polanya disebut pemanggil perintah (invoker). Sebut saja
Switch
dan biarkan ia menerima variabel dalam konstruktor
Command
yang akan digunakan dalam metode yang dibuat
flipUp()
dan
flipDown()
.
public class Switch {
private Command flipUpCommand;
private Command flipDownCommand;
public Switch(Command flipUpCommand,Command flipDownCommand){
this.flipUpCommand=flipUpCommand;
this.flipDownCommand=flipDownCommand;
}
public void flipUp(){
flipUpCommand.execute();
}
public void flipDown(){
flipDownCommand.execute();
}
}
Dan tentu saja, kita akan membuat kelas yang akan menggunakannya untuk memahami apa yang terjadi secara umum. Ini akan disebut metode utama di mana seluruh tindakan akan berlangsung:
public class TestCommand{
public static void main(String[] args){
Light l=new Light();
Command switchUp=new TurnOnLightCommand(l);
Command switchDown=new TurnOffLightCommand(l);
Switch s=new Switch(switchUp,switchDown);
s.flipUp();
s.flipDown();
}
}
Outputnya adalah sebagai berikut:
"The light is on"
"The light is off"
Di mana ini diterapkan?
Tujuannya jelas apa dan mengapa hal ini diperlukan, yaitu: dalam situasi di mana Anda perlu memisahkan eksekusi tertentu, ini sangat memudahkan. Sehingga penggunaan beberapa fungsi tidak bergantung pada implementasi tertentu dan dapat diubah tanpa merusak sistem. kira-kira seperti ini...) Tulis komentar anda, mari kita berdiskusi, mungkin ada yang bisa dibuat lebih sederhana dan diceritakan lebih baik, semuanya akan kita edit jika perlu) Agar bagi yang baru pertama kali membaca, menjadi sejelas mungkin. Nah, siapa pun yang menyukai artikel itu, beri tanda “+” di atasnya :) Ini penting bagi saya) Seiring berjalannya waktu, saya ingin menulis lebih banyak tentang
Builder
,
Singleton
dan lain-lain.
Lihat juga artikel saya yang lain:
GO TO FULL VERSION