Facade karışık interfaceleri basitleştirerek kullanmaya yarar. İsteği gerçekleştiren ile isteği yerine getiren sistem parçalarını birbirlerinden ayırıp ikisinin arasına girer. Eski kodlar, üçüncü şahıs kodları, karışık kodlar veya değiştirilmesi/test etmesi zor olan kodlar en çok fayda sağladığı yerlerdir. Kısacası facade kötü olanı iyi hale getirir.


İyi bir facade class içinde new kelimesi olmaz ve constructor içindeki parametreler interface type-hint şeklinde olurlar.


Uygulanış şekli


  1. Bir tane facade yaratılır.

  2. Facade constructor içine parametreler interface type-hint şeklinde enjekte edilirler.

  3. Enjekte edilen classların methodlarını kullanmak için yeni methodlar yaratılır.

Çalışma şekli


  1. Bir istek oluşur.

  2. İstek facade'ye gider.

  3. Facade ilgili sistem parçasıyla isteği yerine getirmesi için konuşur.

  4. İlgili sistem parçası görevini yaptıktan sonra facade'ye cevap verir - (seçeneğe bağlı).

  5. Facade isteği yapana sonucu iletir - (seçeneğe bağlı).

Örnek


interface ShareInterface
{
public function setMessage($message);
public function share();
}

class Twitter implements ShareInterface
{
private $message;

public function setMessage($message)
{
$this->message = $message;
}

public function share()
{
echo sprintf('Sharing "%s" on Twitter.', $this->message).PHP_EOL;
}
}

class Facebook implements ShareInterface
{
private $message;

public function setMessage($message)
{
$this->message = $message;
}

public function share()
{
echo sprintf('Sharing "%s" on Facebook.', $this->message).PHP_EOL;
}
}

class Linkedin implements ShareInterface
{
private $message;

public function setMessage($message)
{
$this->message = $message;
}

public function share()
{
echo sprintf('Sharing "%s" on Linkedin.', $this->message).PHP_EOL;
}
}

$twitter = new Twitter();
$twitter->setMessage('Learning Facade pattern.');
$twitter->share();

$facebook = new Facebook();
$facebook->setMessage('Learning Facade pattern.');
$facebook->share();

$linkedin = new Linkedin();
$linkedin->setMessage('Learning Facade pattern.');
$linkedin->share();

Yukarıda da gördüğümüz gibi, bir mesajı üç ayrı sosyal medya kanalında paylaşmak için, aynı adımları üç kez tekrarlamak zorunda kaldık. Eğer mesajları paylaşmak için daha fazla sosyal medya kanalı olsaydı, işimiz daha zor olacaktı. İdeal olan şey, tek bir işlemle, mesajları tüm kanallarda paylaşmak olurdu. Bunu yapmak için aşağıdaki facade class örneğini devreye sokmak olacaktır.


class SocialMedia
{
private $twitter;
private $facebook;
private $linkedin;

public function __construct(ShareInterface $twitter, ShareInterface $facebook, ShareInterface $linkedin)
{
$this->twitter = $twitter;
$this->facebook = $facebook;
$this->linkedin = $linkedin;
}

public function setMessage($message)
{
$this->twitter->setMessage($message);
$this->facebook->setMessage($message);
$this->linkedin->setMessage($message);

return $this;
}

public function share()
{
$this->twitter->share();
$this->facebook->share();
$this->linkedin->share();
}
}

$socialMedia = new SocialMedia(new Twitter(), new Facebook(), new Linkedin());
$socialMedia->setMessage('Learning Facade pattern.')->share();

Yukarıda da gördüğümüz gibi, tek bir işlemle mesajları tüm kanallarda paylaşabiliyoruz.