门面模式,别名外观模式。为客户端提供一个统一的接口,客户端不需要知晓接口调用的具体类,甚至可以封装成静态调用方式,参数也是自由传递。
<?php
abstract class Facade{
public static function __callStatic($method, $args)
{
$food = static::getFacade();
$instance = new $food();
return call_user_func_array([$instance, $method], $args);
}
}
class Food extends Facade{
public static function getFacade(){
//具体门面类选择使用哪种类
return 'ChineseFood';
}
}
class ChineseFood{
public function eat() {
return 'noodles';
}
public function drink() {
return 'soup';
}
}
class AmericanFood{
public function eat() {
return 'hamburg';
}
public function drink() {
return 'coke';
}
}
class EuropeanFood{
public function eat() {
return 'bread';
}
public function drink() {
return 'milk';
}
}
class Holiday{
public function haveAMeal() {
echo 'I want to eat ' . Food::eat(). ' and drink ' . Food::drink();
}
}
//client
$holiday = new holiday();
$holiday->haveAMeal();
清明节假期到了,媳妇回娘家了,一个人吃点啥呢,就用这个模式选择吧。
最后总结:
优点:
对客户端屏蔽了子系统组件,实现了松耦合,方便随时更换子系统。
缺点:
接口封装了一切,系统决定了使用哪种具体类,客户端对子系统的实现不够了解。比如存储使用文件、nosql还是mysql。