الگوی Facade

الگوی Facade (نما) در دسته Structural Patterns قرار دارد.واسط (Interface) یکپارچه را به یک مجموعه ای از واسط های یک زیرسیستم فراهم میکند.Façade یک واسط سطح بالایی (higher-level) را تعریف می کند که استفاده از زیرسیستم را آسان تر می کند. به عبارت دیگر خلاصه سازی، و متمرکز سازی واسط یک سیستم شلوغ و پیچیده متشکل از تعداد زیادی کلاس و زیر سیستم به یک واسط سبک، ساده و سطح بالا. UML class diagram شركت كنندگان کلاس ها و اشیاء شرکت کننده در این الگو عبارتند از:نما Facade ( اپ مسکن در مثال دنیای واقعی MortgageApplication) : می داند که چه کلاس های زیرسیستم مسئول درخواست است.درخواست client را به اشیاء زیر سیستم مناسب منتقل می کند.به عبارت دیگر کلاسی است که تمام زیر سیستم ها را می‌شناسد و می‌داند برای اجابت درخواست های کلاینت به کدام کلاس ها و در چه زیر سیستم هایی نیاز است و چگونه باید از آن ها استفاده کند. سپس در پشت صحنه درخواست های خرد شده دیگری را به کلاس ها حواله می دهد، نتایج را جمع آوری کرده و نتیجه نهایی را تحویل کلاینت می دهد. کلاس های زیرسیستم Subsystem classes ( در مثال دنیای واقی بانک ، اعتبار و وامBank, Credit, Loan):پیاده سازی عملکرد زیر سیستم.رسیدگی/مدیریت (handle) به کار اختصاص داده شدهتوسط شی Facade (نما).هیچ آگاهی و هیچ اشاره ای به facade ندارند.به عبارت دیگر قابلیت ها و کارکردهای سیستم را پیاده سازی می کنند.همچنین کاری را که facade به آنها تحویل می دهد اداره کرده و انجام می دهند، اما دانشی نسبت به وجود facade ندارند( ارجاع یا لینکی به چنین کلاسی"منظور facade است"، درونی خود ندارند) .ساختار کلی کداین کد ساختاری الگو، الگوی نما را نشان می دهد که یک رابط ساده و یکنواخت را به زیرسیستم بزرگ کلاس ها ارائه می دهد. using System; namespace DoFactory.GangOfFour.Facade.Structural { /// <summary> /// MainApp startup class for Structural /// Facade Design Pattern. /// </summary> class MainApp { /// <summary> /// Entry point into console application. /// </summary> public static void Main () { Facade facade = new Facade (); facade.MethodA (); facade.MethodB (); // Wait for user Console.ReadKey (); } } /// <summary> /// The 'Subsystem ClassA' class /// </summary> class SubSystemOne { public void MethodOne () { Console.WriteLine (" SubSystemOne Method"); } } /// <summary> /// The 'Subsystem ClassB' class /// </summary> class SubSystemTwo { public void MethodTwo () { Console.WriteLine (" SubSystemTwo Method"); } } /// <summary> /// The 'Subsystem ClassC' class /// </summary> class SubSystemThree { public void MethodThree () { Console.WriteLine (" SubSystemThree Method"); } } /// <summary> /// The 'Subsystem ClassD' class /// </summary> class SubSystemFour { public void MethodFour () { Console.WriteLine (" SubSystemFour Method"); } } /// <summary> /// The 'Facade' class /// </summary> class Facade { private SubSystemOne _one; private SubSystemTwo _two; private SubSystemThree _three; private SubSystemFour _four; public Facade () { _one = new SubSystemOne (); _two = new SubSystemTwo (); _three = new SubSystemThree (); _four = new SubSystemFour (); } public void MethodA () { Console.WriteLine ("\nMethodA() ---- "); _one.MethodOne (); _two.MethodTwo (); _four.MethodFour (); } public void MethodB () { Console.WriteLine ("\nMethodB() ---- "); _two.MethodTwo (); _three.MethodThree (); } } } OutputMethodA () -- -- SubSystemOne MethodSubSystemTwo MethodSubSystemFour MethodMethodB () -- -- SubSystemTwo MethodSubSystemThree Methodیا public class SubSystemA { public void OperationA() { Console.WriteLine("\tSubSystemA.OperationA()"); } } public class SubSystemB { public void OperationB1() { Console.WriteLine("\tSubSystemB.OperationB1()"); } public void OperationB2() { Console.WriteLine("\tSubSystemB.OperationB2()"); } } public class SubSystemC { public void OperationC1() { Console.WriteLine("\tSubSystemC.OperationC1()"); } public void OperationC2() { Console.WriteLine("\tSubSystemC.OperationC2()"); } public void OperationC3() { Console.WriteLine("\tSubSystemC.OperationC3()"); } } public class Facade { private SubSystemA ssa; private SubSystemB ssb; private SubSystemC ssc; public Facade() { ssa = new SubSystemA(); ssb = new SubSystemB(); ssc = new SubSystemC(); } public void ServiceX() { Console.WriteLine("\nFacade.ServiceX() ... "); ssa.OperationA(); ssb.OperationB2(); } public void ServiceY() { Console.WriteLine("\nFacade.ServiceY() ... "); ssc.OperationC3(); ssb.OperationB1(); ssb.OperationB2(); } public void ServiceZ() { Console.WriteLine("\nFacade.ServiceZ() ... "); ssb.OperationB2(); ssa.OperationA(); ssc.OperationC2(); ssc.OperationC1(); } } public class Test { public static void Main() { Facade facade = new Facade(); facade.ServiceX(); facade.ServiceY(); facade.ServiceZ(); Console.ReadKey(); } } /* OutputFacade.ServiceX() ... SubSystemA.OperationA() SubSystemB.OperationB2()Facade.ServiceY() ... SubSystemC.OperationC3() SubSystemB.OperationB1() SubSystemB.OperationB2()Facade.ServiceZ() ... SubSystemB.OperationB2() SubSystemA.OperationA() SubSystemC.OperationC2() SubSystemC.OperationC1()*/ کد دنیای واقعی این کد دنیای واقعی الگوی نمایه را به عنوان یک شیء MortgageApplication نشان می دهد که یک واسط ساده را به یک زیرسیستم بزرگ از کلاس هایی که اندازه اعتبار یک متقاضی را اندازه گیری می کند، فراهم می کند. using System; namespace DoFactory.GangOfFour.Facade.RealWorld { /// <summary> /// MainApp startup class for Real-World /// Facade Design Pattern. /// </summary> class MainApp { /// <summary> /// Entry point into console application. /// </summary> static void Main () { // Facade Mortgage mortgage = new Mortgage (); // Evaluate mortgage eligibility for customer Customer customer = new Customer ("Ann McKinsey"); bool eligible = mortgage.IsEligible (customer, 125000); Console.WriteLine ("\n" + customer.Name + " has been " + (eligible ? "Approved" : "Rejected")); // Wait for user Console.ReadKey (); } } /// <summary> /// The 'Subsystem ClassA' class /// </summary> class Bank { public bool HasSufficientSavings (Customer c, int amount) { Console.WriteLine ("Check bank for " + c.Name); return true; } } /// <summary> /// The 'Subsystem ClassB' class /// </summary> class Credit { public bool HasGoodCredit (Customer c) { Console.WriteLine ("Check credit for " + c.Name); return true; } } /// <summary> /// The 'Subsystem ClassC' class /// </summary> class Loan { public bool HasNoBadLoans (Customer c) { Console.WriteLine ("Check loans for " + c.Name); return true; } } /// <summary> /// Customer class /// </summary> class Customer { private string _name; // Constructor public Customer (string name) { this._name = name; } // Gets the name public string Name { get { return _name; } } } /// <summary> /// The 'Facade' class /// </summary> class Mortgage { private Bank _bank = new Bank (); private Loan _loan = new Loan (); private Credit _credit = new Credit (); public bool IsEligible (Customer cust, int amount) { Console.WriteLine ("{0} applies for {1:C} loan\n", cust.Name, amount); bool eligible = true; // Check creditworthyness of applicant if (!_bank.HasSufficientSavings (cust, amount)) { eligible = false; } else if (!_loan.HasNoBadLoans (cust)) { eligible = false; } else if (!_credit.HasGoodCredit (cust)) { eligible = false; } return eligible; } } } OutputAnn McKinsey appliesfor $125,000.00 loanCheck bank for Ann McKinseyCheck loans for Ann McKinseyCheck credit for Ann McKinseyAnn McKinsey has been Approvedمنبع