PHP之外观形式

外观(Facade)模式

当使用子系统的代码时,你恐怕会开采自个儿过于深入地调用子系统的逻辑代码。假如实系统代码总是在频频变化,而你的代码却又在众多见仁见智地点与子系统代码交互,那么随着子系统的开采进取,你只怕会意识维护代码变得特别费劲。

在项目中合拢复杂的第1方代码,或在系统中渐渐产生大气仅在系统本人内部有用的代码,在那么些意况下,你总能够运用外观方式,为复杂性的连串创建1个简练、清晰的接口。

若是有上边一段很乱的代码,其成效是从文件中得到log消息并将它转变为目标:

function getProductFileLines($file)
{
    return file($file);
}

function getProductObjectFromID($id, $productname)
{
    // 一些数据库查询
    return new Product($id, $productname);
}

function getNameFromLine()
{
    if (preg_match("/.*-(.*)\s\d+/"), $line, $array) {
        return str_replace('_', ' ', $array[1]);
    }
    return '';
}

function getIDFromLine($line)
{
    if (preg_match("/^(\d{1,3})-/", $line, $array)) {
        return $array[1];
    }
    return -1;
}

class Product()
{
    public $id;
    public $name;
    public __construct($id, $name)
    {
        $this->id = $id;
        $this->id = $name;
    }
}

我们的目标是将涵盖类似上面数据的公文转变为3个对象数组:

 234-ladies_jumper 55
 532-gents_hat 44

客户端应用该作用时要调用全体的主意:

$lines = getProductFileLines('text.txt');
$objects = array();
foreach ($lines as $line) {
    $id = getIDFromLine($line);
    $name = getNameFromLine($line);
    $objects[$id] = getProductObjectFromID($id, $name);
}

假定在档期的顺序中一贯调用那些方法,那么大家的代码会和子系统牢牢耦合在联合。当子系统生成时,也许大家决定将其与子系统完全断开时,代码就能够出标题。

上边这些大概的类为上边的进程式代码提供了2个接口:

class ProductFacade
{
    private $products = array();

    function __construct($file)
    {
        $this->file = $file;
        $this->compile();
    }

    private function complie()
    {
        $lines = getProductFileLines($this->line);
        foreach ($lines as $line) {
            $id = getIDFromLine($line);
            $name = getNameFromLine($line);
            $this->products[$id] = getProductObjectFromID($id, $name);
        }
    }

    function getProducts()
    {
        return $this->products;
    }

    function getProduct($id)
    {
        return $this->product[$id];
    }
}

明天,从二个log文件访问Product对象就总结多了:

$facade = new ProductFacade('test.txt');
$facade->getProduct(234);

外观格局的好处:(1)对于调用者来讲,访问代码变得轻巧、相当方便.(二),由于只在叁个地点调用子系统,减少了失误的只怕.(叁),Facade类仍是能够使调用者防止不正确地利用个中方法,从而减弱不当的发生。

注一:那是《深远PHP:面对对象、情势与推行》第楚辞的部分内容(其余的都看不懂,逃~)
注2:此文章也得以在自家独立的博客里面来看:

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注