
الوقت المقدر للقراءة 10 دقيقة.
وصف النموذج
بفرض لدينا نظام معقد ونرغب باستخدام هذا النظام، يقدم النموذج Facade واجهة مبسطة تمكننا من استخدام هذا النظام المعقد دون الدخول في تفاصيله.
يصنف هذا النموذج ضمن النماذج البنيوية.
متى نستخدم النموذج 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 في جميع المشاريع ففي المشاريع البسيطة قد يضيف تعقيداً بدون فائدة تذكر، وهذا الكلام ينطبق على جميع نماذج التصميم.