外观模式
是一种结构型模式,它为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层次的接口,使得子系统更加容易使用。
主要角色
外观(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()
{
...
}
}
网友评论