问题:
使用子系统的代码时,如果过于深入地调用子系统的逻辑代码,会导致代码耦合度过高,当子系统代码发生变化时,调用它的许多地方也需要进行相应的修改。为了避免这种情况的发生,我们需要为一个分层或一个子系统创建一个简单、清晰的对外接口。
概念:
为子系统中的一组接口提供一个一致的界面,此模型定义了一个高层接口,供外界调用,这个接口使得这一子系统更加容易使用。
实现:
代码示例:
class Product
{
public $id;
public $name;
public function __construct($id, $name)
{
$this->id = $id;
$this->name = $name;
}
}
class ProductFacade
{
private $products = [];
public function __construct($file)
{
$this->file = $file;
$this->compile();
}
private function compile()
{
$lines = $this->getProductFileLines($this->file);
foreach($lines as $line) {
$id = $this->getIdFromLine($line);
$name = $this->getNameFromLine($line);
$this->products[$id] = $this->getProductObjectFromId($id, $name);
}
}
private function getProductFileLines($file)
{
// ...
}
private function getIdFromLine($line)
{
// ...
}
private function getNameFromLine($line)
{
// ...
}
private function getProductObjectFromId($id, $name)
{
return new Product($id, $name);
}
public function getProducts()
{
return $this->products;
}
}
$facade = new ProductFacade('test.txt');
$products = $facade->getProducts();
效果:
1. 有助于分离项目中的不同部分。
2. 客户端的访问代码变得简洁,方便。
3. 只在一个地方调用子系统,减少了出错的可能性,并因此可以预估子系统修改带来的问题所在。