外观(Facade)模式

PHP之外观格局,设计形式之外观格局详解。当使用子系统的代码时,你恐怕会开掘本身过于深切地调用子系统的逻辑代码。若是实系统代码总是在时时刻刻变化,而你的代码却又在多数差异地点与子系统代码交互,那么随着子系统的进化,你大概会开掘维护代码变得不行劳累。

在项目中融为一体复杂的第3方代码,或在系统中逐步产生大气仅在系统本人内部有用的代码,在那一个情况下,你总能够应用外观情势,为复杂性的系统创立叁个简练、清晰的接口。

要是有上边一段很乱的代码,其意义是从文件中获取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;
    }
}

大家的目的是将含有类似下边数据的文本调换为2个对象数组:

 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);
}

假若在品种中直接调用这几个措施,那么大家的代码会和子系统牢牢耦合在联合签名。当子系统变化时,或然我们决定将其与子系统完全断开时,代码就会出标题。

下边那一个大约的类为上边的进程式代码提供了二个接口:

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)对于调用者来讲,访问代码变得简洁、非常方便.(二),由于只在2个地方调用子系统,收缩了失误的也许.(三),Facade类仍是能够使调用者制止不得法地采取在那之中方法,从而缩短不当的发生。

注一:那是《深切PHP:面对对象、方式与试行》第10章的有的内容(别的的都看不懂,逃~)
注二:此小说也能够在本身单独的博客里面来看:

外观(Facade)模式

当使用子系统的代码时,你或许会开采自个儿过于深入地调用子系统的逻辑代码。假设实系统代码总是在相连转换,而你的代码却又在诸多不1位置与子系统代码交互,那么随着子系统的进步,你只怕会意识维护代码变得十二分不方便。

在品种中合拢复杂的第2方代码,或在系统中逐年产生大气仅在系统本人内部有用的代码,在那几个景况下,你总能够利用外观方式,为复杂性的种类创设二个简约、清晰的接口。

即便有上边一段很乱的代码,其成效是从文件中获得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;
    }
}

作者们的目标是将富含类似下边数据的公文调换为贰个目的数组:

 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);
}

万1在等级次序中一向调用那个办法,那么大家的代码会和子系统牢牢耦合在一同。当子系统生成时,只怕我们决定将其与子系统完全断开时,代码就会出标题。

上面那么些轻巧的类为下边包车型地铁进度式代码提供了贰个接口:

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];
    }
}

当今,从3个log文件访问Product对象就回顾多了:

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

外观形式的好处:(一)对于调用者来讲,访问代码变得简洁、至极方便.(2),由于只在多少个地点调用子系统,收缩了失误的恐怕.(三),Facade类仍可以够使调用者幸免不科学地利用当中方法,从而收缩不当的发生。

注一:那是《深刻PHP:面对对象、形式与实施》第7章的1部分剧情(其余的都看不懂,逃~)
注2:此文章也足以在本人独自的博客里面看到:

外观格局

当使用子系统的代码时,你恐怕会开采自个儿过于深切地调用子系统的逻辑代码。倘使实系统代码总是在不断变化,而你的代码却又在广大两样地点与子系统代码交互,那么随着子系统的进步,你可能会开掘维护代码变得可怜不方便。

在品种中融为1体复杂的第1方代码,或在系统中稳步形成大气仅在系统自己内部有用的代码,在那个情况下,你总能够使用外观方式,为复杂性的种类创设3个简短、清晰的接口。

若是有上边1段很乱的代码,其职能是从文件中拿到log音讯并将它转换为目的:

function getProductFileLines{    return 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{    if (preg_match("/^-/", $line, $array)) {        return $array[1];    }    return -1;}class Product(){    public $id;    public $name;    public __construct($id, $name)    {        $this->id = $id;        $this->id = $name;    }}

作者们的目标是将富含类似下边数据的公文调换为叁个目的数组:

 234-ladies_jumper 55 532-gents_hat 44

客户端应用该作用时要调用全部的点子:

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

假若在档案的次序中向来调用那几个措施,那么咱们的代码会和子系统牢牢耦合在一块。当子系统生成时,或许大家决定将其与子系统完全断开时,代码就会出标题。

下边那些轻松的类为上边的进度式代码提供了三个接口:

class ProductFacade{    private $products = array();        function __construct    {        $this->file = $file;        $this->compile();    }    private function complie()    {        $lines = getProductFileLines($this->line);        foreach ($lines as $line) {            $id = getIDFromLine;            $name = getNameFromLine;            $this->products[$id] = getProductObjectFromID($id, $name);        }    }    function getProducts()    {        return $this->products;    }    function getProduct    {        return $this->product[$id];    }}

现今,从3个log文件访问Product对象就回顾多了:

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

外观方式的便宜:对于调用者来说,访问代码变得轻便、格外方便.,由于只在四个地点调用子系统,减弱了失误的可能.,Facade类还能够使调用者幸免不科学地行使当中方法,从而减弱不当的发生。

PS壹:那是《深远PHP:面对对象、情势与试行》第7章的片段内容(其余的都看不懂,逃~)
PS二:此小说也得以在本身独立的博客里面看到: PHP之外观情势

浓厚了然JavaScript连串(30):设计情势之外观方式详解

 那篇小说主要介绍了深入驾驭JavaScript体系(30):设计格局之外观形式详解,外观形式(Facade)为子系统中的1组接口提供了贰个等同的分界面,此模块定义了一个高层接口,那个接口值得这一子系统尤其轻松选用,供给的情人能够参见下

 

 

介绍

外观情势(Facade)为子系统中的一组接口提供了一个同样的分界面,此模块定义了2个高层接口,那个接口值得那1子系统进一步便于选取。

正文

外观形式不但简化类中的接口,而且对接口与调用者也实行精晓耦。外观方式常常被以为开拓者必备,它能够将一部分繁杂操作封装起来,并创造三个大致的接口用于调用。

外观情势平时被用来JavaScript类Curry,通过它包裹一些接口用于包容多浏览器,外观格局能够让大家直接调用子系统,从而防止因平素访问子系统而发出不供给的荒唐。

外观形式的优势是便于使用,而且本人也比较轻量级。但也有缺点
外观格局被开辟者再而三使用时会产生一定的品质难点,因为在每一次调用时都要检验成效的可用性。

上边是1段未优化过的代码,大家运用了外观格局通过检测浏览器天性的点子来创立2个跨浏览器的使用方法。

代码如下:

var addMyEvent = function (el, ev, fn) {
if (el.addEventListener) {
el.addEventListener(ev, fn, false);
} else if (el.attachEvent) {
el.attachEvent(‘on’ + ev, fn);
} else {
el[‘on’ + ev] = fn;
金沙注册送58 ,}
};
再来三个简单的例证,说白了就是用二个接口封装其它的接口:

代码如下:

var mobileEvent = {
// …
stop: function (e) {
e.preventDefault();
e.stopPropagation();
}
// …
};

 

总结

那么何时使用外观形式呢?一般的话分多少个阶段:

先是,在规划初期,应该要有察觉地将差异的三个层分离,比方优秀的三层协会,在数据访问层和职业逻辑层、业务逻辑层和表示层之间创制外观Facade。

说不上,在开荒阶段,子系统往往因为不断的重构衍变而变得特别复杂,增添外观Facade能够提供三个大致的接口,减少他们中间的借助。

其三,在尊敬3个遗留的巨型系统时,只怕这些连串现已很难保证了,那时候使用外观Facade也是这几个合适的,为系系统开荒叁个外观Facade类,为设计粗糙和高度复杂的残留代码提供比较明晰的接口,让新系统和Facade对象交互,Facade与遗留代码交互全部的错综复杂工作。

那篇小说首要介绍了尖锐掌握JavaScript类别(30):设计格局之外观形式详解,外观模…

相关小说

连带寻找:

今日看什么

查找本事库

回来首页

  • 隐性调用php程序的章程
  • ASP.NET中母版页和shtml实例入门
  • 浅谈JavaScript中的Math.atan()方法的行使
  • JavaScript中反正弦函数Math.asin()的应用简单介绍
  • JavaScript中的acos()方法运用详解
  • 介绍JavaScript中Math.abs()方法的行使

相关频道:
HTML/CSS  HTML5  Javascript  jQuery  AJax教程  前者代码  正则表明式  Flex教程  WEB前端教程  

帮客争执

相关文章

网站地图xml地图