外观模式

外观模式是一种结构型模式,它为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层次的接口,使得子系统更加容易使用。

主要角色
外观(Facade)角色

  • 此角色将被客户端调用
  • 知道哪些子系统负责处理请求
  • 将用户的请求指派给适当的子系统

子系统(subsystem)角色

  • 实现子系统的功能
  • 处理由Facade对象指派的任务
  • 没有Facade的相关信息,可以被客户端直接调用
  • 可以同时有一个或多个子系统,每个子系统都不是一个单独的类,而一个类的集合。每个子系统都可以被客户端直接调用,或者被外观角色调用。子系统并知道外观模式的存在,对于子系统而言,外观仅仅是另一个客户端。

适用性

  • 为一些复杂的子系统提供一组接口
  • 提高子系统的独立性
  • 在层次化结构中,可以使用外观模式定义系统的每一层的接口

优点

  • 它对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便
  • 实现了子系统与客户之间的松耦合关系
  • 如果应用需要,它并不限制它们使用子系统类。因此可以在系统易用性与能用性之间加以选择

类图

外观模式_第1张图片

实例


class HomeTheaterFacade
{
    private $amp;
    private $tuner;
    private $dvd;
    private $projector;
    private $screen;
    private $popper;

    public function __construct(Amplifier $amp, Tuner $tuner, DvdPlayer $dvd, Projector $projector, Screen $screen, PopcornPopper $popper)
    {
        $this->amp = $amp;
        $this->tuner = $tuner;
        $this->dvd = $dvd;
        $this->projector = $projector;
        $this->screen = $screen;
        $this->popper = $popper;
    }

    public funtion watchMoive()
    {
        $this->pop->on();
        $this->pop->pop();
        $this->screen->down();
        $this->projector->on();
        $this->projector->wideScreenMode();
        $this->amp->on();
        $this->amp->setDvd($dvd);
        $this->dvd->on();
        $this->dvd->play();
    }

    public function endMoive()
    {
        ... 
    }
}


你可能感兴趣的:(外观模式)