Facade design pattern

Bir alt sistemin parçalarını oluşturan classları istemciden soyutlayarak kullanımı daha da kolaylaştırmak için tasarlanmış tasarım kalıbıdır. Mimarisel açıdan ise, karmaşık ve detaylı bir sistemi organize eden ve bir bütün olarak clientlara(istemcilere) sunan yapıdır. Anlayacağınız, karmaşık ve detaylı olarak nitelendirdiğimiz bu sistemi bir alt sistem olarak varsayarsak eğer bu sistemi kullanacak clientlara daha basit bir arayüz sağlamak ve alt sistemleri bu arayüze organize bir şekilde dahil etmek ve bu alt sistemlerin sağlıklı çalışabilmesi için bu arayüz çatısı altında işin algoritmasına uygun işlev sergilemek istersek Facade Design Pattern’i kullanmaktayız.

Burada bilmeniz gereken durum, alt sistem içerisinde bulunan sınıfların birbirlerinden bağımsız olmasıdır. Ayriyetten Facade sınıfından da bağımsız bir şekilde çalışabilmektedirler.
Facade bizim classlarımızı içermek zorundadır ve operasyonu yaparken onlara ait fonksiyonellikleri kullanması gerekli.

Aşağıdaki Banka, Kredi ve Merkezbanka classları birlikte müşteri bilgisine farklı açılardan bakarak sonuç olarak müşterinin kredi kullanıp kullanamayacağına karar veren bir sistemdir.

Aşağıdaki senaryo facade tasarım kalıbını görmek için yazılmış basit bir senaryodur gerçek senaryolarda facadenin kullandıgı sistem classları çoğunlukla librarylerden gelmektedir.

*Banka classı 

 class Banka
 {
   public bool KrediyiKullan(Musteri m, decimal talepEdilenMiktar)
   {
     return true;
   }
 }

  *Kredi classı : Kredi Kullanma Durumu sorgular

  class Kredi
  {
    public bool KrediKullanmaDurumu(Musteri m)
    {
     return true;
    }
 }

 *MerkezBanka classı : Müşteri kara listede mi değil mi sorgulayan class

 class MerkezBanka
 {
    public bool KaraListeKontrol(string tcNo)
    {
     return false;
    }
 }

 *Musteri classı : Yardımcı class

 class Musteri
 {
    public int MusteriNumarasi { get; set; }
    public string TcNo { get; set; }
    public string Ad { get; set; }
 }

*Facade Classı : Facade class’ı içerisinde müşterinin istediği fonksiyonelliği gerisinde bulunan sistemdeki parçaları organize ederek tek elden sunar.

class Facade
{
   private Banka _banka;
   private MerkezBanka _merkezBanka;
   private Kredi _kredi;

   public Facade()
   {
    _banka = new Banka();
    _merkezBanka = new MerkezBanka();
    _kredi = new Kredi();

   }

 public void KrediKullan(Musteri m, decimal talep)
 {
     if(!_merkezBanka.KaraListeKontrol(m.TcNo) && _kredi.KrediKullanmaDurumu(m))
     {
       _banka.KrediyiKullan(m, talep);
        Console.WriteLine("krediyi kullandırdık");
     }
 
    }
 }

*Main method

static void Main(string[] args)
 {
    Facade fcd = new Facade();

    fcd.KrediKullan(new Musteri { Ad = "Burak", TcNo = "123303", MusteriNumarasi = 4234242 },1000) ;
 }