外观模式(Facade) 属于7种结构型模式中比较好理解的一种模式,
主要作用是为客户端提供一个统一的接口,不需要用户自己去创建各子类然后调用他们的方法。
好处是把子系统的逻辑和交互都隐藏了起来,缺点是每添加一个子类,都有可能要修改外观类(违反开闭原则)。
起初学习外观模式的时候有点和之前学习过的简单工厂模式混淆。
因为它们的结构还挺像的,都是提供一个统一的接口,之后看了些资料进行了对比。
就像是房产中介,你到了中介说要买一个二室一厅的房子,中介就给你提供一个二室一厅的房子。
外观模式更像是高级私人订制。
主要作用是为客户端提供一个统一的接口,不需要用户自己去创建各子类然后调用他们的方法。
好处是把子系统的逻辑和交互都隐藏了起来,缺点是每添加一个子类,都有可能要修改外观类(违反开闭原则)。
起初学习外观模式的时候有点和之前学习过的简单工厂模式混淆。
因为它们的结构还挺像的,都是提供一个统一的接口,之后看了些资料进行了对比。
区别
简单工厂属于创建型模式,更注重创建对象,根据客户端提供的要求,创建相应的对象。就像是房产中介,你到了中介说要买一个二室一厅的房子,中介就给你提供一个二室一厅的房子。
外观模式更像是高级私人订制。
你到了中介说要买一个房子,中介根据各种情况的衡量,最后给你提供一个两室一厅的房子。
<?php
header("Content-Type:text/html;charset=utf-8");
// 外观模式 index.php
require_once "Facade.php";
// 实例化外观类
$Client = new Facade();
// 直接调用给出方案
$Client->buy();
$Client->sell();
<?php
/**
* Created by Sublime.
* User: Ryan
* Date: 2018/1/25
* File:Facade.php
*/
/** 买房 子类
* BuyHouse
*/
Class BuyHouse
{
function planA(){
echo "买入一室一厅的房子。<br/>";
}
function planB(){
echo "买入两室一厅的房子。<br/>";
}
function planC(){
echo "买入别墅。<br/>";
}
}
/** 卖房 子类
* SellHouse
*/
Class SellHouse
{
function planA(){
echo "高收益卖出房子。<br/>";
}
function planB(){
echo "低收益卖出房子。<br/>";
}
}
/** 统一接口 外观类
* Facade
*/
Class Facade {
private $BuyHouse;
private $SellHouse;
function __construct(){
$this->BuyHouse = new BuyHouse();
$this->SellHouse = new SellHouse();
}
function buy(){
$this->BuyHouse->planB();
}
function sell(){
$this->SellHouse->planA();
}
}
输出结果:
买入两室一厅的房子。
高收益卖出房子。