看代码学设计模式之外观模式

小文blog小文 2016-11-29 10:34 1741人围观

模式定义

外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。

简单来说,外观模式的就是让client客户端以一种简单的方式来调用比较复杂的系统,来完成一件事情。

如果我要开启一辆车,通常我要开车门,用钥匙打火(即开启发动机引擎),踩油门就能把车开起来。那么在这一系列的动作中,我们可能会涉及到很多的动作或方法。我们停车时,要刹车,关引擎,关车门。也同样会涉及到好几个类好几个方法。我们看下面的类:

class CarDoor {  
  
    public function open()  
    {  
        echo "打开车门".PHP_EOL;  
    }  
  
    public function close()  
    {  
        echo "关车门".PHP_EOL;  
    }  
}  
  
class Engine {  
  
    public function start()  
    {  
        echo "即开启发动机引擎".PHP_EOL;  
    }  
  
    public function stop()  
    {  
        echo "关闭引擎".PHP_EOL;  
    }  
}  
  
class Accelerator {  
  
    public function run()  
    {  
        echo "踩油门".PHP_EOL;  
    }  
}  
  
class Breaking {  
  
    public function run()  
    {  
        echo "踩刹车".PHP_EOL;  
    }  
}

 

类和方法都很多。如果我们每回要开动一辆车都要调用这么多方法,很累人的。也没有必要。这样我们就建立一个类,把这些运作都包装起来。因为我们看到,其实我们只关心开车和停车两个大动作。

interface Drive {  
  
    public function start();  
  
    public function stop();  
}   
  
class Driver implements Drive {  
  
    public function __construct()  
    {  
        $this->_door = new CarDoor();  
        $this->_eingine = new Engine();  
        $this->_accelerator = new Accelerator();  
        $this->_breaking = new Breaking();  
    }  
  
    public function start()  
    {  
        $this->_door->open();  
        $this->_eingine->start();  
        $this->_accelerator->run();  
    }  
  
    public function stop()  
    {  
        $this->_breaking->run();  
        $this->_eingine->stop();  
        $this->_door->close();  
    }  
} 
$DriverFacade = new Driver();
$DriverFacade->start();
echo "<br />";
$DriverFacade->stop();

浏览器输出

facade.png

我们可以看到,我们通过Driver类将所有相关子类包装了一下,封装了一个接口,实现了开车和停车两个方法。这种包装的方法就叫做外观模式。意识就是说,它对外只暴露出两个有效的方法。以这种方式降低调用者与各子类的耦合度。

何时使用

首先,在设计初期阶段,应该要有意识将不同的两个层分离;

其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖;

第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展,此时,你可以为新系统开发一个外观Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。

转载请注明来自小文blog,本文标题:看代码学设计模式之外观模式

发布评论
生活是一场戏,主角当累了,你亦可成为观众,停下脚步,歇一歇