Facade被用来简化现有复杂接口的使用。它将客户与子系统解耦,因此客户与facade而不是子系统进行交互。在处理遗留代码、第三方代码、复杂代码或难以重构/测试的代码时,它尤其方便。因此,简而言之,facade将丑陋的东西变成了美好的东西。
一个好的facade会有一个带有接口类型提示参数的构造器,并且不会有new 关键字。
如何实现它
-
创建一个将成为门面的类。
-
把原来的类作为接口类型提示的参数传递给facade的构造函数。
-
创建可以使用原类方法的方法。
它是如何工作的
-
客户端请求一些东西。
-
请求被转到门面。
-
Facade与相关的子系统对话,以完成该工作。
-
子系统在完成工作后回复给门面--(可选)。
-
Facade回应给客户--(可选)。
例子
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();
正如你所看到的,为了在三个不同的社交媒体渠道上分享一条信息,我们最终重复了三次相同的步骤。如果我们有更多的社交媒体渠道来分享信息,那就更痛苦了。最理想的情况是,一次性在所有社交媒体渠道上分享信息。要做到这一点,我们可以引入一个Facade类,如下图所示:
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();
正如你所看到的,我们只需设置一次信息,就可以一次性分享到所有三个社交媒体渠道。