Hər kəsə salam, Forum üzvləri!
Mən hərtərəfli (mənə elə gəlir) nümunəni başa düşdüm
Command
və bu barədə "öz sözlərimlə" danışmağa çalışmaq istəyirəm.
Vikipediyaya əsaslanaraq öyrənə bilərik ki, onun məqsədi
göndərən və qəbul edən sinifin bir-birindən birbaşa asılı olmadığı struktur yaratmaqdır. Göndərən sinfi ehtiva edən sinfə geri zəngin təşkili . Prinsipcə, aydın və düzgün yazılmışdır, lakin bu, nəzəri cəhətdəndir. Bunu necə etmək olar? Problemlər buradan başlayır, çünki... təsviri artıq o qədər də aydın və aydın deyil. Buna görə də başa düşdüm, bunu necə başa düşdüyümü sizə izah etmək qərarına gəldim, bəlkə kiməsə faydalı olacaq: Bu nümunənin məqsədinin təsvirinə əsaslanaraq, daha aydın olması üçün təsviri kodla birləşdirəcəyəm, çünki eyni Vikipediyada onu bir çox dillər üçün ümumiləşdirdilər və buna görə də təsvir nümunədən ayrıldı. Bu nümunədə dörd termin var, gəlin onları indiki kimi qəbul edək: əmrlər (
command
), əmr qəbuledicisi (
receiver
), əmr çağıran (
invoker
) və müştəri (
client
). Eyni Vikipediyadan misal çəkəcəyəm, buna kifayət qədər dözümlüdür.
Tapşırıq iki şeyi edə bilən bir sinifdir
Light
: işığı yandırın və söndürün.
receiver
Nümunə baxımından "əmr qəbuledicisi ( )" olacaq.
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");
}
}
İcra edəcək və "komanda ( )" nümunəsi
execute()
baxımından çağırılan bir metodla interfeys yaradaq.
command
public interface Command{
void execute();
}
Sinif bacarıqlarının icrasını əhatə etmək lazımdır
Light
. Bunun üçün biz interfeysi həyata keçirən
TurnOnLightCommand
və konstruktorda sinif obyektini qəbul edən siniflər yaradacağıq . Və onların hər biri yalnız bir hərəkət edəcək. Biri metodu çağıracaq , digəri isə çağıracaq .
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();
}
}
İndi bu əhatə olunmuş obyekt metodlarını qəbul edən obyekt yaratmağın vaxtıdır
Light
. Nümunə baxımından ona əmr çağıran (invoker) deyilir. Onu çağıraq
Switch
və konstruktorda
Command
yaradılan metodlarda istifadə olunacaq dəyişənləri qəbul edək
flipUp()
və
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();
}
}
Və əlbəttə ki, biz ümumi nə baş verdiyini anlamaq üçün onlardan istifadə edəcək bir sinif yaradacağıq. Bütün hərəkətlərin baş verəcəyi əsas üsul adlandırılacaq:
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();
}
}
Çıxış aşağıdakı olacaq:
"The light is on"
"The light is off"
Bu harada tətbiq olunur?
Məqsəd aydındır ki, bunun nəyə və nəyə ehtiyacı var, yəni: müəyyən bir icranı ayırmaq lazım olan bir vəziyyətdə, bu çox rahatdır. Beləliklə, bəzi funksiyaların istifadəsi müəyyən bir tətbiqdən asılı deyil və sistemə zərər vermədən dəyişdirilə bilər. belə bir şey...) Şərhlərinizi yazın, müzakirə edək, bəlkə nəyisə sadələşdirib daha yaxşı izah etmək olar, lazım olsa hər şeyi redaktə edərik) İlk dəfə oxuyanlar üçün mümkün qədər aydın olsun.
Builder
Yaxşı, kimin məqaləsi xoşuna gəlirsə, üzərinə “+” işarəsi qoyur :) Bu mənim üçün vacibdir) Zaman keçdikcə ,
Singleton
və digərləri haqqında daha çox yazmaq istəyirəm .
Digər məqalələrimə də baxın:
GO TO FULL VERSION