PHP中的Facade设计模式实例

88 阅读1分钟

Facade被用来简化现有复杂接口的使用。它将客户与子系统解耦,因此客户与facade而不是子系统进行交互。在处理遗留代码、第三方代码、复杂代码或难以重构/测试的代码时,它尤其方便。因此,简而言之,facade将丑陋的东西变成了美好的东西。

一个好的facade会有一个带有接口类型提示参数的构造器,并且不会有new 关键字。

如何实现它

  1. 创建一个将成为门面的类。

  2. 把原来的类作为接口类型提示的参数传递给facade的构造函数。

  3. 创建可以使用原类方法的方法。

它是如何工作的

  1. 客户端请求一些东西。

  2. 请求被转到门面。

  3. Facade与相关的子系统对话,以完成该工作。

  4. 子系统在完成工作后回复给门面--(可选)。

  5. 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();

正如你所看到的,我们只需设置一次信息,就可以一次性分享到所有三个社交媒体渠道。