原创设计的套路:原创
原创设计的套路:原创
外观模式是指外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式又称为门面模式,它是一种对象结构型模式,类似网站导航,将 https://www.google.com、https://www.baidu.com、https://cn.bing.com ... 等很多网站统一包装起来,用户通过这个包装的页面进而再访问那些被包装的站点。
外观模式很好的体现了“ 迪米特法则 ”,降低原有系统的复杂度,同时降低客户类与子系统类的耦合,但该模式有个最大的缺点,就是违背了“ OCP原则(开放封闭原则) ”,需要增加或者移除某个子系统的时候,需要修改外观类,进一步抽象外观类一定程度上可以解决这个问题,客户端针对抽象外观类进行编码,新的业务需求则对应的增加一个具体的外观类,不修改原有的抽象外观类。
外观模式具体实践中,多用在为复杂的模块或子系统提供外部访问的模块,子系统相对独立。
// 空调
namespace Mode\Facade;
class AirConditioner {
public function on() {
echo '开空调<br />';
}
public function off() {
echo '关空调<br />';
}
}
// 电视
namespace Mode\Facade;
class Television {
public function on() {
echo '开电视<br />';
}
public function off() {
echo '关电视<br />';
}
}
// 灯
namespace Mode\Facade;
class Light {
public function on() {
echo '开灯<br />';
}
public function off() {
echo '关灯<br />';
}
}
// 智能控制
namespace Mode\Facade;
class Smart {
private $tv;
private $air;
private $light;
public function __construct() {
$this->tv = new Television();
$this->air = new AirConditioner();
$this->light = new Light();
}
public function getUp() {
echo '起床了 ( 一键搞定 )<br>';
$this->light->on();
$this->tv->on();
$this->air->on();
}
public function sleep() {
echo '睡觉了 ( 一键搞定 )<br>';
$this->light->off();
$this->tv->off();
$this->air->off();
}
}
// 调用
require '../autoload.php';
use Mode\Facade\Light;
use Mode\Facade\Television;
use Mode\Facade\AirConditioner;
use Mode\Facade\Smart;
//传统方式
$light = new Light();
$tv = new Television();
$air = new AirConditioner();
echo '起床<br>';
$light->on();
$tv->on();
$air->on();
echo '<br>';
echo '睡觉<br>';
$light->off();
$tv->off();
$air->off();
echo '<br>';
//智能家居 - 外观模式
$smart = new Smart();
$smart->getUp();
echo '<br>';
$smart->sleep();