
الگوی طراحـــــــــی Facade
الگوی طراحی Facade یکی از الگوهای ساختاری (Structural Patterns) است که هدف آن ایجاد یک واسط سادهتر برای دسترسی به یک زیرسیستم پیچیدهتر است. با استفاده از این الگو، میتوانیم یک واسط یکپارچهتر و انتزاعیتر ارائه دهیم که کار با زیرسیستمهای پیچیده را برای کاربران آسانتر میکند. این الگو به ما امکان انتزاع از جزئیات پیچیده و سادهتر کردن واسط کار با یک سیستم را میدهد.
برای بهتر درک این الگو، بهتر است یک مثال کاربردی در دنیای واقعی را در نظر بگیریم. فرض کنید شما یک سیستم پرداخت آنلاین دارید که برای انجام پرداختها نیاز به ارتباط با چندین درگاه پرداخت مختلف دارد. هر درگاه پرداخت نیاز به اتصال به سرویسهای بانکی و انجام اعتبارسنجی دارد. برای سادهتر کردن روند پرداخت و انتزاع از جزئیات زیرسیستمها، از الگوی Facade استفاده میکنیم.
برای درک بهتر این الگو، با یک مثال ملموس و کاربردی در دنیای واقعی آشنا میشویم:
1. Subsystem (زیرسیستم): اینجا کلاسهای مرتبط با درگاههای پرداخت را تعریف میکنیم.
1// درگاه پرداخت بانک ملت
2public class BankMellatGateway
3{
4 public bool Pay(decimal amount)
5 {
6 // انجام پرداخت با استفاده از درگاه بانک ملت
7 return true;
8 }
9
10 public bool ValidateCredentials(string username, string password)
11 {
12 // اعتبارسنجی اطلاعات کاربری برای درگاه بانک ملت
13 return true;
14 }
15}
16
17// درگاه پرداخت بانک سامان
18public class BankSamanGateway
19{
20 public bool Pay(decimal amount)
21 {
22 // انجام پرداخت با استفاده از درگاه بانک سامان
23 return true;
24 }
25
26 public bool ValidateCredentials(string apiKey)
27 {
28 // اعتبارسنجی API Key برای درگاه بانک سامان
29 return true;
30 }
31}
2. Facade: اینجا کلاس `PaymentFacade` را تعریف میکنیم که به عنوان واسط بین سیستم پرداخت و زیرسیستمهای پرداخت عمل میکند.
1public class PaymentFacade
2{
3 private BankMellatGateway mellatGateway;
4 private BankSamanGateway samanGateway;
5
6 public PaymentFacade()
7 {
8 mellatGateway = new BankMellatGateway();
9 samanGateway = new BankSamanGateway();
10 }
11
12 public bool PayWithMellat(decimal amount, string username, string password)
13 {
14 if (mellatGateway.ValidateCredentials(username, password))
15 {
16 return mellatGateway.Pay(amount);
17 }
18 return false;
19 }
20
21 public bool PayWithSaman(decimal amount, string apiKey)
22 {
23 if (samanGateway.ValidateCredentials(apiKey))
24 {
25 return samanGateway.Pay(amount);
26 }
27 return false;
28 }
29}
3. Client (کلاینت): اینجا برنامهای را با توجه به الگوی Facade ایجاد میکنیم و امکان انجام پرداخت با درگاههای مختلف را به کاربر میدهیم.
1public class Program
2{
3 public static void Main()
4 {
5 PaymentFacade paymentFacade = new PaymentFacade();
6
7 // پرداخت با درگاه بانک ملت
8 bool mellatPaymentResult = paymentFacade.PayWithMellat(100, "username", "password");
9 if (mellatPaymentResult)
10 {
11 Console.WriteLine("Payment with Mellat gateway was successful!");
12 }
13 else
14 {
15 Console.WriteLine("Payment with Mellat gateway failed!");
16 }
17
18 // پرداخت با درگاه بانک سامان
19 bool samanPaymentResult = paymentFacade.PayWithSaman(200, "apiKey");
20 if (samanPaymentResult)
21 {
22 Console.WriteLine("Payment with Saman gateway was successful!");
23 }
24 else
25 {
26 Console.WriteLine("Payment with Saman gateway failed!");
27 }
28 }
29}
خروجی برنامه به صورت زیر خواهد بود:
Payment with Mellat gateway was successful!
Payment with Saman gateway was successful!
در این مثال با استفاده از الگوی Facade، توانستیم یک واسط سادهتر و انتزاعیتر برای دسترسی به زیرسیستمهای پرداخت را ایجاد کنیم. کاربران میتوانند با استفاده از واسط Facade به راحتی با درگاههای پرداخت ارتباط برقرار کنند بدون اینکه نیاز به دانش درباره جزئیات پیادهسازی آنها داشته باشند. این الگو به ما امکان انتزاع از جزئیات پیچیده و ارائه واسطهای سادهتر را میدهد و ساختار کد را بهبود میبخشد.