Hello semua, ahli Forum!
Saya telah dengan teliti (sepertinya saya) mengetahui coraknya
Command
dan saya ingin cuba bercakap mengenainya "dengan kata-kata saya sendiri."
Berdasarkan Wikipedia, kita dapat mengetahui bahawa tujuannya adalah
untuk mencipta struktur di mana kelas penghantaran dan kelas penerima tidak bergantung secara langsung antara satu sama lain. Mengatur panggilan balik ke kelas yang termasuk kelas penghantar . Pada dasarnya, ia ditulis dengan jelas dan betul, tetapi ini adalah secara teori. Bagaimana untuk melakukan ini? Di sinilah masalah bermula, kerana... penerangannya tidak lagi begitu jelas dan jelas. Oleh itu, saya memikirkannya, saya memutuskan untuk memberitahu anda bagaimana saya memahaminya, mungkin ia berguna kepada seseorang: Berdasarkan penerangan tujuan corak ini, saya akan menggabungkan penerangan dengan kod untuk menjadikannya lebih jelas, kerana dalam Wikipedia yang sama mereka menyamaratakannya untuk banyak bahasa dan oleh itu penerangan dipisahkan daripada contoh. Terdapat empat istilah dalam corak ini, mari kita ambil mudah buat masa ini: commands(
command
), command receiver(
receiver
), command caller(
invoker
) dan client(
client
). Saya akan mengambil contoh dari Wikipedia yang sama, ia agak boleh diterima.
Tugasan ialah kelas
Light
yang boleh melakukan dua perkara: hidupkan lampu dan matikannya. Dari segi corak ia akan menjadi "penerima arahan (
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 buat antara muka dengan satu kaedah
execute()
yang akan dilaksanakan dan yang dipanggil dari segi corak "perintah (
command
)"
public interface Command{
void execute();
}
Ia adalah perlu untuk merangkum pelaksanaan kemahiran kelas
Light
. Untuk melakukan ini, kami akan mencipta kelas
TurnOnLightCommand
dan
TurnOffLightCommand
yang melaksanakan antara muka
Command
dan yang akan menerima objek kelas dalam constructor
Light
. Dan setiap daripada mereka akan melakukan hanya satu tindakan. Satu akan memanggil kaedah
turnOn()
, dan satu lagi 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();
}
}
Kini tiba masanya untuk mencipta objek yang menerima kaedah objek terkapsul ini
Light
. Dari segi corak, ia dipanggil pemanggil arahan (invoker). Mari kita panggil
Switch
dan biarkan ia menerima pembolehubah dalam pembina
Command
yang akan digunakan dalam kaedah 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 sudah tentu, kami akan mencipta kelas yang akan menggunakannya untuk memahami perkara yang berlaku secara umum. Ia akan dipanggil kaedah utama, di mana semua tindakan akan berlaku:
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 seperti berikut:
"The light is on"
"The light is off"
Di mana ini digunakan?
Tujuannya adalah jelas apa dan mengapa ini diperlukan, iaitu: dalam situasi di mana anda perlu memisahkan pelaksanaan tertentu, ini sangat mudah. Supaya penggunaan beberapa fungsi tidak bergantung kepada pelaksanaan tertentu dan ia boleh diubah tanpa merosakkan sistem. macam ni...) Tulis komen anda, mari kita bincang, mungkin ada yang boleh dipermudahkan dan diceritakan dengan lebih baik, semuanya akan kami edit jika perlu) Supaya bagi yang pertama kali membaca, sejelas mungkin. Nah, sesiapa yang suka artikel itu meletakkan "+" padanya :) Ini penting untuk saya) Lama kelamaan, saya mahu menulis lebih lanjut tentang
Builder
,
Singleton
dan lain-lain.
Lihat juga artikel saya yang lain:
GO TO FULL VERSION