设计模式历险记之外观模式

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

先来看看它的结构图吧:

从上面的结构图我们可以读出,外观类给子系统提供了一系列额接口,供外部客户端调用。从而实现外部客户端和子系统解耦。

举一个小栗子吧:

现在有这样一种场景,系统A需要用到系统B的部分方法,但是系统B的代码很乱。

先用普通的方式来实现这个场景:

<?php

class SystemB{
    public function function1(){
        echo 'function1';
    }

    public function function2(){
        echo 'function2';
    }

    public function function3(){
        echo 'function3';
    }
}

class SystemA{

    private $systemB;

    //和SystemB紧耦合了,
    public function __construct(){
        $this->systemB = new SystemB();
    }

    public function function1(){
        $this->systemB->function1();
        $this->systemB->function2();
        $this->systemB->function3();
        
    }
}

如果直接像上面那样,在系统A中直接去调取系统B中的方法,这样两个系统高度耦合,如果还有一个地方需要这样调用B系统的话,那么重复的代码会写多次,这样不好。

用外观模式来实现这个场景:

<?php

class SystemB{
    public function function1(){
        echo 'function1';
    }

    public function function2(){
        echo 'function2';
    }

    public function function3(){
        echo 'function3';
    }
}

class Facade{
    private $systemB;

    public function __construct(){
        $this->systemB = new SystemB();
    }

    public function callToA(){
        $this->systemB->function1();
        $this->systemB->function2();
        $this->systemB->function3();
    }
}

class SystemA{

    private $facade;

    //通过门脸将SystemB解耦
    public function __construct(){
        $this->facade = new Facade();
    }

    public function function1(){
        $this->facade->callToA();

    }
}

通过门面模式将系统A和系统B解耦,这个时候系统A完全不知道有系统B的存在,并且利于B系统的接口复用,同时满足了迪米特法则。

迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

总结一下吧:

门面模式通过门面类嵌入多个子系统的接口将客户端和子系统解耦,
有利于复用,
降低了系统之间调用的复杂性。
门面模式不会禁止你访问子系统,你任然可以直接访问子系统。

Snail's Blog
请先登录后发表评论
  • 最新评论
  • 总共0条评论
  • 本博客使用免费开源的 laravel-bjyblog v5.5.1.3 -develop 搭建 © 2014-2018 www.snail-c.cn 版权所有 ICP证:蜀ICP备18023253号-1
  • 联系邮箱:459921737@qq.com