外观模式 Facade Pattern

未匹配的标注

定义

为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

设计的原则和思想

  1. 解耦的是客户端和子系统。
  2. 不变部分是子系统,变化部分是多个子系统之间的依赖性。
  3. 核心思想是封装交互,简化调用。

一句话概括设计模式

为多个业务类的调用提供了一个统一的入口,简化了类与类之间的交互。

结构中包含的角色

  1. Facade(外观角色)
  2. SubSystem(子系统角色)

最小可表达代码

class SubSystemA
{
    public function executeA()
    {
        echo 'SubSystemA : executeA;';
    }
}

class SubSystemB
{
    public function executeB()
    {
        echo 'SubSystemB : executeB;';
    }
}

class Facade  
{  
    private $subSystemA;
    private $subSystemB;

    public function __construct()
    {  
        $this->subSystemA = new SubSystemA();
        $this->subSystemB = new SubSystemB();
    }

    public function execute()
    {
        $this->subSystemA->executeA();
        $this->subSystemB->executeB();
    }
}

(new Facade())->execute();

优点

  1. 客户端代码将变得很简单,与之关联的对象也很少。
  2. 减少系统相互依赖。
  3. 可以独立于复杂子系统。

缺点

  1. 外观者可能与很多类都有耦合,修改代码非常麻烦。
  2. 新增子系统,可能需要修改外观者的代码,外观者设计难度高,可扩展性低。

何时使用

  1. 为访问一系列复杂的子系统提供一个简单入口时。
  2. 将多个接口调用替换为一个门面接口调用,减少网络通信成本,提高 App
  3. 需要屏蔽系统的底层实现,隐藏系统的复杂性,提供一组更加简单易用、更高层的接口。
  4. 创建外观来定义子系统中各层次的入口,以减少子系统之间的耦合。
  5. 需要解耦子系统和客户端。

实际应用场景

  1. 去医院看病,前台就是外观者。
  2. Laravel的门面。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
发起讨论 只看当前版本


暂无话题~