النموذج Facade

الوقت المقدر للقراءة 10 دقيقة.

وصف النموذج

بفرض لدينا نظام معقد ونرغب باستخدام هذا النظام، يقدم النموذج Facade واجهة مبسطة تمكننا من استخدام هذا النظام المعقد دون الدخول في تفاصيله.

يصنف هذا النموذج ضمن النماذج البنيوية.

Facade-01

متى نستخدم النموذج Façade

عند الحاجة لطلب خدمات من نظام معقد او من عدة أنظمة معقدة يمكن إنشاء Facade للتعامل مع هذه الأنظمة ونقوم بطلب الخدمات من ال Facade بدل طلبها من هذه الأنظمة.

كيفية تطبيق النموذج Facade

تختلف طريقة التطبيق باختلاف النظام المعقد، وبشكل عام يمكن استخدام المنهجية التالية:

  • بناء الصف Facade الذي يحوي الخدمات المطلوبة
  • تحقيق هذه الخدمات ضمن الصف Facade عبر طلبها من النظام المعقد
  • استخدام الخدمات من قبل العملاء عبر طلبها من الصف Façade
/**
 *
 * @author Mutasem
 */
public class System1 {
    public static void Service1(){
   //service logic
    }
    public static void Service2(){
    //
    }
}

public class System2 {
    public static void Service3(){
   //some code
    }
    public static void Service4(){
   //
    }
}
/******************************************************/
public class Facade {

    public void service1() {
         System1.Service1();
    }

    public void service2() {
         System1.Service2();
    }

    public void service3() {
         System2.Service3();
    }

    public void service4() {
         System2.Service4();
    }
}
/*******************************************************/
public class Client {
    public static void main(String[] args) {
        Facade facade=new Facade();
        facade.service1();
        facade.service2();
        facade.service3();
        facade.service4();
        
    }
}

مثال للتوضيح

بفرض لدينا مجموعة من الصفوف التي تقدم خدمات رسم الأشكال الهندسية بالشكل التالي:

/**
 *
 * @author Mutasem
 */
public abstract class Shape {
    public abstract  void draw();
}

/****************************************/
public class Circle extends Shape{

    @Override
    public void draw() {
        System.out.println("Drawing Circle");
    }
    
}

/***************************************/
public class Rectangle extends Shape{

    @Override
    public void draw() {
        System.out.println("Drawing Rectangle");
    }
    
}

/*******************************/
public class Triangle extends Shape {

    @Override
    public void draw() {
        System.out.println("Drawing Triangle");
    }
}

وبفرض لدينا الصف Client الذي يرغب بالاستفادة من خدمات هذه الصفوف لرسم مجموعة من الأشكال الهندسية فيكون الحل بالطريقة العادية كالتالي:

/**
 *
 * @author Mutasem
 */
public class Client {

    public static void main(String[] args) {
        Circle circle = new Circle();
        Rectangle rectangle = new Rectangle();
        Triangle triangle = new Triangle();
        circle.draw();
        rectangle.draw();
        triangle.draw();
    }

}


الحل باستخدام النموذج Façade

/**
 *
 * @author Mutasem
 */
public class Facade {
    Circle circle;
    Triangle triangle;
    Rectangle rectangle;

    public Facade() {
        circle=new Circle();
        triangle=new Triangle();
        rectangle=new Rectangle();
    }
    public void drawCircle(){
    circle.draw();
    }
    public  void drawRect(){
    rectangle.draw();
    }
    public  void drawTri(){
    triangle.draw();
    }
}
/*********************************/
public class Client {

    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.drawCircle();
        facade.drawRect();
        facade.drawTri();
    }

}

ملاحظة

ليس من الصواب استخدام النموذج Facade في جميع المشاريع ففي المشاريع البسيطة قد يضيف تعقيداً بدون فائدة تذكر، وهذا الكلام ينطبق على جميع نماذج التصميم.

رابط السلسلة على GitHub

https://github.com/mutasemhajhasan/Design-Patterns