什么是外观模式
我觉得这是最容易理解的一个设计模式了。就是把多个方法的调用封装到一起,方便调用。
使用场景
比如人People、车Car、桥Bridge这三个对象,要实现一个简单的场景---24岁的人,姓名叫李四,开着红色的车在石桥上跑。
如果用传统方式来做,那么每次实现这个场景的时候,都需要实例化People、Car、Bridge这三个类,然后去调用设置名字、设置年龄、设置性别、设置车的颜色、设置桥的种类这6种方法。
想象以下前后端对接的场景,这种情况就要提供六个接口给前端,无疑增大了前后端的工作量,令人烦躁。
但是如果这些方法封装到一个方法里,只提供一个接口给前端,岂不快哉。
示意图
优点
减少了工作量,方便管理
缺点
不符合开闭原则
代码实例
目录结构
People.php 人
<?php
class People{
public $name;//名字
public $sex;//性别
public $age;//年龄
/**
* 设置名字
* @param mixed $name
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* 设置性别
* @param mixed $sex
*/
public function setSex($sex)
{
$this->sex = $sex;
return $this;
}
/**
* 设置年龄
* @param mixed $age
*/
public function setAge($age)
{
$this->age = $age;
return $this;
}
}
Car.php 车
<?php
class Car{
public $color;//颜色
/**
* 设置颜色
* @param mixed $color
*/
public function setColor($color)
{
$this->color = $color;
return $this;
}
}
Bridge.php 桥
<?php
class Bridge{
public $bridge;//种类
/**
* 设置种类
* @param mixed $bridge
*/
public function setBridge($bridge)
{
$this->bridge = $bridge;
return $this;
}
}
Facade.php 外观类
<?php
class Facade{
/**
* 封装该场景需要用到的所有方法
* @param $name
* @param $sex
* @param $age
* @param $color
* @param $bridge
*/
function action($name,$sex,$age,$color,$bridge){
$people = new People();
$people->setName($name);
$people->setSex($sex);
$people->setAge($age);
$car = new Car();
$car->setColor($color);
$bridgeOb = new Bridge();
$bridgeOb->setBridge($bridge);
echo $people->age.'的'.$people->sex.',名字叫'.$people->name.',开着'.$car->color.'的车在'.$bridgeOb->bridge.'跑';
}
}
client.php 调用
<?php
require_once 'Car.php';
require_once 'People.php';
require_once 'Bridge.php';
require_once 'Facade.php';
//传统模式
$people = new People();
$people->setName('李四');
$people->setSex('男人');
$people->setAge('24');
$car = new Car();
$car->setColor('红色');
$bridgeOb = new Bridge();
$bridgeOb->setBridge('石桥');
echo $people->age.'的'.$people->sex.',名字叫'.$people->name.',开着'.$car->color.'的车在'.$bridgeOb->bridge.'跑';
echo '<br>';
//外观模式
$facade = new Facade();
$facade->action('李四','男人','24','红色','石桥');
运行结果