简介:
门面模式又称之为外观模式,属于结构型的设计模式。
用于为子系统中的一组接口提供一致的调用方案。门面模式定义了一个高层接口,引入门面角色之后,只需要直接与门面角色交互,降低了系统的耦合度。
适用场景:
- 最经典的Laravel的Facade,当使用一些库的时候,不需要了解底层系统如何实现,只需要知道如何使用门面调用即可。
 - 为一些复杂的子系统提供一个简单对外开放的调用方案。
 
优点:
- 对客户端,屏蔽了子系统的实现逻辑,只留出可供使用的方法,让开发人员很方便的看出来子系统可供调用的功能。
 - 实现了子系统与调用端的松耦合关系。
 - 扩展性很强,子类系统不受限制。
 
缺点:
隔绝了子系统的具体实现代码,增加代码溯源的难度。
代码:
//注:这里的门面写法和Laravel中的不一样,Laravel的门面是基于门面模式提供了一套强大且优雅的模块子系统解决方案,而此处的门面只是一种实现门面思想的示例。
class Facade {
    private $pc;
    private $mobile;
    public function __construct(Mobile $mobile, PC $pc) {
        $this->mobile = $mobile;
        $this->pc     = $pc;
    }
    public function turnOn() {
        $this->mobile->turnOn();
        $this->pc->turnOn();
    }
    public function turnOff() {
        $this->pc->turnOff();
        $this->mobile->turnOff();
    }
}
//子系统接口
interface PC {
    public function turnOn();
    public function turnOff();
}
//子系统接口
interface  Mobile {
    public function turnOn();
    public function turnOff();
}
//子系统实现
class ASUS implements PC {
    public function turnOn() {
        echo '华硕电脑开机' . PHP_EOL;
    }
    public function turnOff() {
        echo '华硕电脑关机' . PHP_EOL;
    }
}
//子系统实现
class Vivo implements Mobile {
    public function turnOn() {
        echo 'Vivo手机开机' . PHP_EOL;
    }
    public function turnOff() {
        echo 'Vivo手机关机' . PHP_EOL;
    }
}
//调用端==========================================
$facade = new Facade(new Vivo(), new ASUS());
$facade->turnOn();
$facade->turnOff();