Hammaga salom forum a'zolari!
Men (menga o'xshab) naqshni yaxshilab tushunib oldim
Command
va bu haqda "o'z so'zlarim bilan" gapirishga harakat qilmoqchiman.
Vikipediyaga asoslanib, uning maqsadi jo'natuvchi sinf va qabul qiluvchi sinf bir-biriga bevosita bog'liq bo'lmagan tuzilmani yaratish ekanligini bilib olamiz .
Yuboruvchi sinfni o'z ichiga olgan sinfga qayta qo'ng'iroq qilishni tashkil qilish . Aslida, u aniq va to'g'ri yozilgan, ammo bu nazariy jihatdan. Buni qanday qilish kerak? Muammolar shu yerda boshlanadi, chunki... tavsif endi unchalik aniq va ravshan emas. Shuning uchun, men buni tushundim, sizga buni qanday tushunganimni aytib berishga qaror qildim, ehtimol bu kimgadir foydali bo'ladi: Ushbu naqshning maqsadi tavsifiga asoslanib, men uni yanada aniqroq qilish uchun tavsifni kod bilan birlashtiraman, chunki Xuddi shu Vikipediyada ular uni ko'plab tillar uchun umumlashtirgan va shuning uchun tavsif misoldan ajratilgan. Ushbu naqshda to'rtta atama mavjud, keling, ularni hozircha odatiy hol sifatida qabul qilaylik: buyruqlar (
command
), buyruq qabul qiluvchisi (
receiver
), buyruq chaqiruvchisi (
invoker
) va mijoz (
client
). Men o'sha Vikipediyadan misol keltiraman, bunga toqat qilish mumkin.
Vazifa ikkita narsani qila oladigan sinfdir
Light
: chiroqni yoqing va uni o'chiring. Shakl bo'yicha u "buyruqni qabul qiluvchi (
receiver
)" bo'ladi.
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");
}
}
Keling, bajariladigan va "buyruq ( )" namunasi
execute()
bo'yicha chaqiriladigan bir usul bilan interfeys yarataylik.
command
public interface Command{
void execute();
}
Sinf ko'nikmalarining bajarilishini qamrab olish kerak
Light
. Buning uchun biz interfeysni amalga oshiradigan
TurnOnLightCommand
va konstruktorda sinf ob'ektini qabul qiladigan sinflarni yaratamiz . Va ularning har biri faqat bitta harakatni bajaradi. Biri usulni chaqiradi , ikkinchisi esa chaqiradi .
TurnOffLightCommand
Command
Light
turnOn()
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();
}
}
Endi bu inkapsullangan ob'ekt usullarini qabul qiladigan ob'ektni yaratish vaqti keldi
Light
. Shakl nuqtai nazaridan u buyruq chaqiruvchisi (invoker) deb ataladi. Keling, uni chaqiramiz va yaratilgan usullarda ishlatiladigan va
Switch
konstruktordagi o'zgaruvchilarni qabul qilaylik .
Command
flipUp()
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();
}
}
Va, albatta, biz ularni umumiy nima bo'layotganini tushunish uchun ishlatadigan sinf yaratamiz. U asosiy usul deb ataladi, unda barcha harakatlar amalga oshiriladi:
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();
}
}
Chiqish quyidagicha bo'ladi:
"The light is on"
"The light is off"
Bu qayerda qo'llaniladi?
Maqsad, bu nima va nima uchun kerakligi aniq, ya'ni: muayyan ijroni ajratish kerak bo'lgan vaziyatda bu juda qulay. Shunday qilib, ba'zi funktsiyalardan foydalanish ma'lum bir dasturga bog'liq emas va uni tizimga zarar bermasdan o'zgartirish mumkin. shunga o'xshash narsa...) O'z fikr-mulohazalaringizni yozing, keling, muhokama qilamiz, balki biror narsani sodda qilib, yaxshiroq aytib berish mumkin, kerak bo'lsa hammasini tahrir qilamiz) Birinchi marta o'qiydiganlar uchun imkon qadar tushunarli bo'lishi uchun.
Builder
Xo'sh, kimga maqola yoqsa, unga "+" qo'yadi :) Bu men uchun muhim) Vaqt o'tishi bilan men ,
Singleton
va boshqalar haqida ko'proq yozmoqchiman .
Boshqa maqolalarimni ham ko'ring:
GO TO FULL VERSION