外观模式

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

主要角色
外观(Facade)角色

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

子系统(subsystem)角色

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

适用性

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

优点

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

类图

实例


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()
    {
        ... 
    }
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容