الگوی طراحی visitor در جاوا اسکریپت

الگوی طراحی visitor در جاوا اسکریپت نوشته شده در   javascript 25 دسامبر , 2018 توسط  عباس حسینی

گاهی اوقات برای من پیش اومده که وقتی با اسنپ به جایی میرم وسط راه یک توقف کوتاه میزنم و این یک مبلغی به مبلغ اولیه اضافه میکنه
آیا تا به حال برای شما هم پیش اومده که علاوه بر حقوق ماهیانه، مبلغی بابت پاداش یا عیدی دریافت کنید ؟
خب باید بگم که همه این حرفا که زدم در واقع به نوعی استفاده از الگوی visitor است که در ادامه بطور کامل به آن خواهیم پرداخت

تعریف الگوی طراحی visitor در جاوا اسکریپت

visitor design pattern یا الگوی طراحی visitor در تعریف به ما میگه که الگوریتم از آبجکت باید جدا باشد و بدون تغییر روی آجکت این الگوریت روی آن اعمال بشود

الگوی طراحی visitor
اگر به شکل بالا دقت کنید این الگو سه بخش اصلی دارد

component : بخشی است که دارای یک متد accept است که از طریق آن یک visitor را میپذیرد تا روی آن تغییر ایجاد کند

element : بخشی از یک کامپوننت یا آبجکت میباشد که به دست visitor سپرده میشود

visitor : بخشی که الگوریتمی است که میتواند روی یک element از آبجکت تغییراتی را ایجاد میکند

با توجه به شکل کلاینت این امکان رو داشته که یک visitor جدیدی رو برای یک آبجکت یا کامپوننت accept کند و visitor بر اساس الگوریتمی که دارد یک تغییری روی کامپوننتی که آن را پذیرش کرده ایجاد میکند

فرض کنید مدیر عامل یک شرکت در نقش client و برنامه نویسان آن شرکت نقش آبجکت یا کامپوننت ها را دارند و visitor هم نقش تعیین پاداش برای مهندسان را دارد

مدیر عامل برای اینکه به مهندسان پاداش بدهد آنها را به دست visitor  میسپارد (یعنی accept میکند) تا بر اساس الگوریتمش برای آنها پاداش تعیین کند

بطور کلی الگوی visitor یعنی ما بخواهیم روی یک آبجکت یک الگوریتم را اعمال کنیم، بدون اینکه روی خودش تغییر ایجاد کنیم و این کار را از طریق یک visitor به شرط پذیرش از سمت خود آبجکت انجام میدهیم

نحوه پیاده سازی الگوی طراحی visitor در جاو اسکریپت

برای پیاده سازی الگوی visitor من قصد دارم همان مثلا مدیر عامل و کارمندان را پیاده سازی کنم ، پس فرض میکنم یک شرکتی وجود دارد که تعدادی کارمند داخل آن مشغول به کار هستند و تعدادی از آنها طراح و برخی دیگر برنامه نویس هستند که ماهیانه مبلغی حقوق دریافت میکنند
مدیر شرکت دنبال راه حلی هست که به کارمندان خود بر اساس میزان شایستگی پاداش بدهد برای پیاده سازی آن یک کلاس به نام Employee میسازیم که شامل متد accept برای پذیرش visitor میباشد و دو کلاس Developer و Designer از آن به ارث میبرند


class Employee {
    constructor(salary) {
        this.bonus = 0;
        this.salary = salary;
    }
    accept(visitor) {
        visitor(this);
    }
}

class Developer extends Employee {
    constructor(salary) {
        super(salary);
    }
}

class Designer extends Employee {
    constructor(salary) {
        super(salary);
    }
}

حال یک visitor به نام bonusVisitor تشکیل میدهیم و در آن الگوریتم مربوطه پاداش دهی هر کارمند را تعیین میکنیم که برنامه نویس دو برابر حقوق دریافتی پاداش دریافت میکند و طراح هیچ پاداشی دریافت نمیکند


function bonusVisitor(employee) {
    if (employee instanceof Developer)
        employee.bonus = employee.salary * 2;
    if (employee instanceof Designer)
        employee.bonus = employee.salary;
}

سپس bonusVisitor را برای هر دو کلاس Developer و Designer پذیرش یا accept میکنیم و شما در انتها میتوانید نتیجه آن را مشاهده کنید

See the Pen Javascript Visitor Pattern by abbas hosseini (@abizebel) on CodePen.

موارد استفاده از الگوی visitor در جاوا اسکریپت

این الگو زمانی استفاده میشود که قصد اعمال چند الگوریتم مختلف را روی یک آبجکت داشته باشیم بدون اینکه روی اصل آبجکت تغییر ایجاد کنیم از آنجایی که هدف از استفاده ا الگوی visitor این است که الگوریتمی روی یک آبجکت اعمال شود بدون اینکه تغییر روی آبجکت اصلی داده شود پس اصل open/closed principle بخوی در آن رعایت میشود

لیست الگوهای طراحی GOF در جاو اسکریپت

 

Creational Patterns

 

Structural Patterns

 

Behavioral Patterns