JavaRush /وبلاگ جاوا /Random-FA /الگوی فرمان به زبان خودتان
Roman_kh
مرحله
Харьков

الگوی فرمان به زبان خودتان

در گروه منتشر شد

سلام به همه اعضای انجمن

من به طور کامل (به نظر من) الگو را کشف کرده ام Commandو می خواهم سعی کنم "به قول خودم" در مورد آن صحبت کنم. الگوی فرمان به قول خودتان - 1بر اساس ویکی‌پدیا، می‌توان فهمید که هدف آن ایجاد ساختاری است که در آن کلاس فرستنده و کلاس گیرنده مستقیماً به یکدیگر وابسته نباشند. سازماندهی تماس برگشتی به کلاسی که شامل کلاس فرستنده است . اصولاً واضح و درست نوشته شده است، اما این در تئوری است. چطور این کار را بکنیم؟ مشکلات از اینجا شروع می شود، زیرا ... توضیحات دیگر چندان واضح و واضح نیست. بنابراین، من آن را فهمیدم، تصمیم گرفتم به شما بگویم که چگونه آن را فهمیدم، شاید برای کسی مفید باشد: بر اساس شرح هدف این الگو، من توضیحات را با کد ترکیب می کنم تا واضح تر شود. زیرا در همان ویکی‌پدیا آن را برای بسیاری از زبان‌ها تعمیم دادند و بنابراین توضیحات از مثال جدا شده است. چهار اصطلاح در این الگو وجود دارد، بیایید فعلا آنها را بدیهی در نظر بگیریم: commands( command)، command receiver( receiver)، command caller( invoker) و client( client). از همین ویکی پدیا مثال می زنم، کاملا قابل تحمل است. وظیفه کلاسی است Lightکه می تواند دو کار انجام دهد: روشن کردن چراغ و خاموش کردن آن. از نظر الگو، "گیرنده فرمان ( receiver)" خواهد بود.
/*Receiver class*/

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)" فراخوانی می شود.
/*the Command interface*/

public interface Command{
    void execute();
}
لازم است که اجرای مهارت های کلاس را محصور کنیم Light. برای انجام این کار، کلاس‌هایی ایجاد می‌کنیم TurnOnLightCommandکه TurnOffLightCommandرابط را پیاده‌سازی می‌کنند Commandو یک شی کلاس را در سازنده می‌پذیرند Light. و هر یک از آنها فقط یک عمل را انجام خواهند داد. یکی متد را فراخوانی می کند turnOn()و دیگری فراخوانی می کند turnOff().
/*the Command for turning on the light*/

public class TurnOnLightCommand implements Command{
   private Light theLight;

   public TurnOnLightCommand(Light light){
        this.theLight=light;
       }

   public void execute(){
      theLight.turnOn();
   }
}

/*the Command for turning off the light*/

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().
/*the Invoker class*/

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();
    }
}
و البته، ما کلاسی ایجاد خواهیم کرد که از آنها برای درک کلی اتفاقات استفاده می کند. این روش اصلی نامیده می شود که در آن تمام اقدامات انجام می شود:
/*The test class*/
public class TestCommand{
   public static void main(String[] args){
       // создаем an object, который будет использоваться
       Light l=new Light();
       // создаем an objectы для всех умений an object Light:
       Command switchUp=new TurnOnLightCommand(l);
       Command switchDown=new TurnOffLightCommand(l);

       // Создаемтся invoker, с которым мы будем непосредственно контактировать:
       Switch s=new Switch(switchUp,switchDown);

       // вот проверка этого, используем методы:
       s.flipUp();
       s.flipDown();
   }
}
خروجی به صورت زیر خواهد بود:
"The light is on"
"The light is off"

این کجا اعمال می شود؟

هدف مشخص است که چه چیزی و چرا این مورد نیاز است، یعنی: در شرایطی که باید یک اجرای خاص را جدا کنید، این بسیار راحت است. به طوری که استفاده از برخی توابع به پیاده سازی خاصی بستگی ندارد و می توان آن را بدون آسیب رساندن به سیستم تغییر داد. چیزی شبیه این...) نظرات خود را بنویسید، بیایید بحث کنیم، شاید بتوان چیزی را ساده تر کرد و بهتر گفت، در صورت لزوم همه چیز را ویرایش می کنیم) تا برای کسانی که برای اولین بار می خوانند، تا حد امکان واضح باشد. Builderخوب، هر کسی که مقاله را دوست داشته باشد، یک "+" روی آن قرار می دهد :) این برای من مهم است) با گذشت زمان ، می خواهم بیشتر در مورد Singletonو دیگران بنویسم. مقالات دیگر من را نیز ببینید:
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION