سلام به همه اعضای انجمن
من به طور کامل (به نظر من) الگو را کشف کرده ام
Command
و می خواهم سعی کنم "به قول خودم" در مورد آن صحبت کنم.
بر اساس ویکیپدیا، میتوان فهمید که هدف آن
ایجاد ساختاری است که در آن کلاس فرستنده و کلاس گیرنده مستقیماً به یکدیگر وابسته نباشند. سازماندهی تماس برگشتی به کلاسی که شامل کلاس فرستنده است . اصولاً واضح و درست نوشته شده است، اما این در تئوری است. چطور این کار را بکنیم؟ مشکلات از اینجا شروع می شود، زیرا ... توضیحات دیگر چندان واضح و واضح نیست. بنابراین، من آن را فهمیدم، تصمیم گرفتم به شما بگویم که چگونه آن را فهمیدم، شاید برای کسی مفید باشد: بر اساس شرح هدف این الگو، من توضیحات را با کد ترکیب می کنم تا واضح تر شود. زیرا در همان ویکیپدیا آن را برای بسیاری از زبانها تعمیم دادند و بنابراین توضیحات از مثال جدا شده است. چهار اصطلاح در این الگو وجود دارد، بیایید فعلا آنها را بدیهی در نظر بگیریم: commands(
command
)، command receiver(
receiver
)، command caller(
invoker
) و client(
client
). از همین ویکی پدیا مثال می زنم، کاملا قابل تحمل است.
وظیفه کلاسی است
Light
که می تواند دو کار انجام دهد: روشن کردن چراغ و خاموش کردن آن. از نظر الگو، "گیرنده فرمان (
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");
}
}
بیایید یک رابط با یک متد ایجاد کنیم
execute()
که اجرا می شود و از نظر الگوی "فرمان (
command
)" فراخوانی می شود.
public interface Command{
void execute();
}
لازم است که اجرای مهارت های کلاس را محصور کنیم
Light
. برای انجام این کار، کلاسهایی ایجاد میکنیم
TurnOnLightCommand
که
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();
}
}
اکنون زمان ایجاد یک شی است که این روش های شی کپسوله شده را بپذیرد
Light
. از نظر الگو به آن فراخوان فرمان (دعوت کننده) می گویند. بیایید آن را فراخوانی کنیم
Switch
و اجازه دهیم متغیرهایی را در سازنده بپذیرد
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();
}
}
و البته، ما کلاسی ایجاد خواهیم کرد که از آنها برای درک کلی اتفاقات استفاده می کند. این روش اصلی نامیده می شود که در آن تمام اقدامات انجام می شود:
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();
}
}
خروجی به صورت زیر خواهد بود:
"The light is on"
"The light is off"
این کجا اعمال می شود؟
هدف مشخص است که چه چیزی و چرا این مورد نیاز است، یعنی: در شرایطی که باید یک اجرای خاص را جدا کنید، این بسیار راحت است. به طوری که استفاده از برخی توابع به پیاده سازی خاصی بستگی ندارد و می توان آن را بدون آسیب رساندن به سیستم تغییر داد. چیزی شبیه این...) نظرات خود را بنویسید، بیایید بحث کنیم، شاید بتوان چیزی را ساده تر کرد و بهتر گفت، در صورت لزوم همه چیز را ویرایش می کنیم) تا برای کسانی که برای اولین بار می خوانند، تا حد امکان واضح باشد.
Builder
خوب، هر کسی که مقاله را دوست داشته باشد، یک "+" روی آن قرار می دهد :) این برای من مهم است) با گذشت زمان ، می خواهم بیشتر در مورد
Singleton
و دیگران بنویسم.
مقالات دیگر من را نیز ببینید:
GO TO FULL VERSION