门面模式(Facade)又称外观模式,用于为子系统中的一组接口提供一个一致的界面。门面模式定义了一个高层接口,这个接口使得子系统更加容易使用:引入门面角色之后,用户只需要直接与门面角色交互,用户与子系统之间的复杂关系由门面角色来实现,从而降低了系统的耦合度。
打个比方,比如我们要在淘宝买东西,我基本上只需要鼠标点一些按钮就完成了。
但是实际上网站的后台是 很多个子系统一起去完成 你购买商品的任务的,比如网站系统,购物车系统,订单系统,用户中心系统,支付系统。
这些系统 对外通过了统一的接口,让你在网站上点按钮就可以完成买东西的需求。这就是门面模式。我的理解起这个名称的人关注的是由多个接口不统一的子系统对外提供统一的接口,好像形成了一个界面或者门面一样。
下面模拟一个
"用户操作设备"
,你一看就能恍然大悟!
说了这么多理论,你可能感到迷惑,想千遍,不如做一遍!
复制粘贴,跑起来!
<?php
/**
* 门面设计模式(Facade)
* 看不懂你打我!
*/
class Camera
{
/**
* 打开录像机
*/
public function turnOn()
{
echo "打开录像机" . '<br/>';
}
/**
* 关闭录像机
*/
public function turnOff()
{
echo "关闭录像机" . '<br/>';
}
}
class Light
{
/**
* 开灯
*/
public function turnOn()
{
echo "开灯" . '<br/>';
}
/**
* 关灯
*/
public function turnOff()
{
echo "关灯" . '<br/>';
}
/**
* 换灯泡
*/
public function changeBulb()
{
echo "换灯泡" . '<br/>';
}
}
class Sensor
{
/**
* 启动感应器
*/
public function activate()
{
echo "启动感应器" . '<br/>';
}
/**
* 关闭感应器
*/
public function deactivate()
{
echo "关闭感应器" . '<br/>';
}
/**
* 触发感应器
*/
public function trigger()
{
echo "触发感应器" . '<br/>';
}
}
class Alarm {
/**
* 启动警报器
*/
public function activate()
{
echo "启动报警器" . '<br/>';
}
/**
* 关闭警报器
*/
public function deactivate()
{
echo "关闭报警器" . '<br/>';
}
/**
* 拉响警报器
*/
public function ring()
{
echo "拉响报警器" . '<br/>';
}
/**
* 停掉警报器
*/
public function stopRing()
{
echo "停掉报警器" . '<br/>';
}
}
/**
* 门面类(Facade)
* 负责将"分散"的功能提供统一接口
*/
class Facade
{
/* 录像机 */
private $_camera;
/* 灯 */
private $_light;
/* 感应器 */
private $_sensor;
/* 警报器 */
private $_alarm;
public function __construct()
{
$this->_camera = new Camera();
$this->_light = new Light();
$this->_sensor = new Sensor();
$this->_alarm = new Alarm();
}
/**
* 启动接口: (打开录像机/开灯/启动感应器/启动报警器)
* @return void
*/
public function activate()
{
// 打开录像机
$this->_camera -> turnOn();
// 开灯
$this->_light -> turnOn();
// 启动感应器
$this->_sensor -> activate();
// 启动报警器
$this->_alarm -> activate();
// 分隔符(方便观察)
echo '<hr>';
}
/**
* 关闭接口: (关闭录像机/关灯/关闭感应器/关闭报警器)
* @return void
*/
public function deactivate()
{
// 关闭录像机
$this->_camera -> turnOff();
// 关灯
$this->_light -> turnOff();
// 关闭感应器
$this->_sensor -> deactivate();
// 关闭报警器
$this->_alarm -> deactivate();
// 分隔符(方便观察)
echo '<hr>';
}
/**
* 其他功能接口: (换灯泡/触发感应器/拉响警报器/停掉警报器)
* @return void
*/
public function otherFunction()
{
// 换灯泡
$this->_light -> changeBulb();
// 触发感应器
$this->_sensor -> trigger();
// 拉响警报器
$this->_alarm -> ring();
// 停掉警报器
$this->_alarm -> stopRing();
// 分隔符(方便观察)
echo '<hr>';
}
}
/**
* 客户端(由用户触发接口功能)
*/
class Client
{
private static $_security;
/**
* 主程序(Main program)
* @return void
*/
public static function main()
{
// 实例化门面类(Facade)
self::$_security = new Facade();
/**
* 用户操作(operation)
* @activate(): 开启操作
* @deactivate(): 关闭操作
* @otherFunction(): 其他操作
*/
self::$_security -> activate();
self::$_security -> deactivate();
self::$_security -> otherFunction();
}
}
/**
* console main();
*/
Client::main();
?>
客户端结果:
说白了,就是将复杂的功能统一使用一个接口管理起来!
当然,以上示例写在一个文件中 只是为了告诉你什么是门面模式,真正开发中 功能类
、门面类
、客户端类
,都是分离模块化(不同文件夹与文件),高内聚低耦合嘛。