زمان تخمینی مطالعه: 9 دقیقه

الگوی Facade یا نما، پیچیدگی‌های سیستم را پنهان می‌کند و اینترفیسی را برای مشتری فراهم می‌کند که با استفاده از آن مشتری می‌تواند به سیستم دسترسی داشته باشد. این نوع الگوی طراحی زیر مجموعه‌ای از الگوی ساختاری(Structural) قرار می‌گیرد زیرا این الگو یک اینترفیس به سیستم موجود اضافه می‌کند تا پیچیدگی‌های آن را پنهان کند. این الگو شامل یک کلاس واحد است که متدهای ساده شده مورد نیاز مشتری را ارائه می‌دهد و فراخوانی‌ها را به متدهای کلاس‌های سیستم موجود واگذار می‌کند. در واقع Facade یک الگوی طراحی است که یک اینترفیس ساده برای یک کتابخانه، یک چارچوب یا هر مجموعه پیچیده دیگری از کلاس‌ها را ارائه می‌دهد.

Facade design pattern

بیان مسئله: تصور کنید که باید کد نوشته شده شما باید با مجموعه وسیعی از اشیاء که به یک کتابخانه یا چارچوب پیچیده تعلق دارند، کار کند. به طور معمول، شما باید تمام این اشیاء را مقداردهی اولیه کنید، وابستگی‌ها را پیگیری کنید، متدها را به ترتیب صحیح اجرا کنید و غیره. در نتیجه، منطق تجاری کلاس‌های شما به شدت با جزئیات پیاده‌سازی کلاس‌های شخص ثالث مرتبط می‌شود و درک و نگهداری آن را سخت می‌کند.

الگوی Facade کلاسی است که یک اینترفیس ساده برای یک زیرسیستم پیچیده که شامل تعداد زیادی قطعات متحرک است فراهم می‌کند. یک الگوی نما ممکن است عملکرد محدودی را در مقایسه با کار مستقیم با زیرسیستم ارائه دهد. با این حال، فقط شامل ویژگی‌هایی است که مشتریان واقعاً به آنها اهمیت می‌دهند. داشتن الگوی Facade زمانی مفید است که نیاز دارید برنامه خود را با کتابخانه‌ای پیچیده که دارای ده‌ها ویژگی است یکپارچه کنید، اما شما فقط به تعداد کمی از عملکرد آن نیاز دارید. به عنوان مثال، اپلیکیشنی که ویدیوهای خنده‌دار کوتاه با گربه‌ها را در رسانه‌های اجتماعی آپلود می‌کند، می‌تواند به طور بالقوه از یک کتابخانه تبدیل ویدیویی حرفه‌ای استفاده کند. با این حال، تمام چیزی که واقعاً به آن نیاز دارد، یک کلاس با متد واحد encode(filename, format) است. پس از ایجاد چنین کلاسی و اتصال آن با کتابخانه تبدیل ویدیو، اولین الگوی Facade خود را خواهید داشت.

نمونه قابل قیاس در دنیای واقعی

هنگامی که برای سفارش تلفنی، مشتری با یک مغازه تماس می‌گیرد، اپراتور پاسخگو به مشتری در واقع نمایانگر شما برای تمامی خدمات و بخش‌های فروشگاهی است که اداره می‌کنید. این اپراتور یک رابط صوتی ساده برای سیستم سفارش، درگاه‌های پرداخت و خدمات مختلف تحویل را در اختیار شما قرار می‌دهد.

An example of taking a phone order
ثبت سفارشات بصورت تلفنی

ساختار الگوی Facade

در این بخش به بررسی ساختار الگوی نما(Facade) می‌پردازیم و پیاده‌سازی آن را به صورت UML خواهیم دید. 

شبه کد(Pseudocode)

در این مثال، الگوی Facade تعامل با یک چارچوب پیچیده تبدیل ویدیو را ساده می‌کند.

The structure of the Facade pattern example
نمونه‌ای از جداسازی چند وابستگی در یک کلاس Facade.

به جای اینکه کاری کنید که کد شما مستقیماً با ده‌ها کلاس فریمورک کار کند، یک کلاس Facade ایجاد کند که آن عملکرد را محصور می‌کند و آن را از بقیه کدها پنهان می‌کند. این ساختار همچنین به شما کمک می‌کند تا تلاش برای ارتقاء به نسخه‌های آینده فریم ورک یا جایگزینی آن با فریمورک دیگری را به حداقل برسانید. تنها چیزی که باید در برنامه خود تغییر دهید، اجرای متدهای الگوی Facade است.

// These are some of the classes of a complex 3rd-party video
// conversion framework. We don't control that code, therefore
// can't simplify it.

class VideoFile
// ...

class OggCompressionCodec
// ...

class MPEG4CompressionCodec
// ...

class CodecFactory
// ...

class BitrateReader
// ...

class AudioMixer
// ...


// We create a facade class to hide the framework's complexity
// behind a simple interface. It's a trade-off between
// functionality and simplicity.
class VideoConverter is
    method convert(filename, format):File is
        file = new VideoFile(filename)
        sourceCodec = (new CodecFactory).extract(file)
        if (format == "mp4")
            destinationCodec = new MPEG4CompressionCodec()
        else
            destinationCodec = new OggCompressionCodec()
        buffer = BitrateReader.read(filename, sourceCodec)
        result = BitrateReader.convert(buffer, destinationCodec)
        result = (new AudioMixer()).fix(result)
        return new File(result)

// Application classes don't depend on a billion classes
// provided by the complex framework. Also, if you decide to
// switch frameworks, you only need to rewrite the facade class.
class Application is
    method main() is
        convertor = new VideoConverter()
        mp4 = convertor.convert("funny-cats-video.ogg", "mp4")
        mp4.save()

قابلیت‌ها و کاربرد‌ها

نحوه پیاده‌سازی

  1. بررسی کنید که آیا امکان ارائه رابط کاربری ساده‌تر از آنچه که یک زیر سیستم موجود در حال حاضر ارائه می‌دهد وجود دارد یا خیر. اگر این اینترفیس کد مشتری را از بسیاری از کلاس‌های زیر سیستم مستقل کند، در مسیر درستی هستید.
  2. این اینترفیس را در یک کلاس نمای جدید تعریف و پیاده‌سازی کنید. نما باید فراخوانی‌ها را از کد مشتری به اشیاء مناسب زیر سیستم هدایت کند. نما باید مسئول اولیه‌سازی زیرسیستم و مدیریت چرخه عمر بیشتر آن باشد مگر اینکه کد مشتری قبلاً این کار را انجام دهد.
  3. برای بهره‌مندی کامل از الگوی Facade، کاری کنید که تمام کدهای مشتری فقط از طریق نما با زیر سیستم ارتباط برقرار کنند. اکنون کد مشتری از هر گونه تغییر در کد زیر سیستم محافظت می‌شود. به عنوان مثال، هنگامی که یک زیر سیستم به نسخه جدید ارتقا می‌یابد، فقط باید کد موجود در نما را تغییر دهید.
  4. اگر نما خیلی بزرگ شد، بخشی از رفتار آن را به یک کلاس نمای جدید و تصفیه شده انتقال دهید.

مزایا و معایب الگوی Facade

این الگوی طراحی دارای مزایا و معایبی به شرح زیر است:

– مزایا

– معایب

ارتباط با الگوهای دیگر

نمونه کد الگوی Facade

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *