5

我已经阅读了一篇关于http://addyosmani.com/largescalejavascript/的精彩文章

本文解释了如何为 JavaScript 应用程序组合模块、外观和中介。

我可以编写文章解释的代码,但我不明白为什么我需要使用外观来访问中介。

我想我可以直接从我的模块访问调解器。

请给我提意见..

PS:这是一个有效的问题吗?

4

2 回答 2

3

该部分的参考资料 Pro Javascript Design Patterns 很好地回答了您的问题,其中包含以下内容:

外墙从来都不是绝对必要的。没有它们也可以完成相同的任务。这是一种组织模式;它允许您修改类和对象的接口以更方便您。

于 2011-10-19T20:32:09.027 回答
0

基于 Thedric Walker 的回答......

拿这个,也许是荒谬的类比:

你是一只啄木鸟(模块),你想挑选一些已经躺在房子的支撑结构(核心)上的幼虫(数据)。通常,您只需从基础设施上啄掉幼虫(实际上啄木鸟有一条长长的带刺的舌头,围绕着它们的头骨),但一些木匠(应用程序架构师)已经在房子外面应用了一个门面。然而,木匠很好地在门面上戳了几个洞,只允许啄木鸟接近幼虫。此外,木匠足够聪明,可以将这些做成某种形状——让啄木鸟每次啄食完成更多吃幼虫的任务。

那么为什么还要有一个门面呢?

将 Facade 与 Addy 的帖子相关联——Facade 增强了沙箱,因为沙箱提供了预定义的功能,允许一个模块以特定方式完成任务,例如批发。例如,您不会想要一个强制用户编写的沙箱:

var node = getNode('#errorPanel'); node.innerHTML = 'Field is invalid!';

一个更好的沙箱可能有这样的东西:

notifyUser.error('Field is invalid!');

另一方面,Facade 可以监听通道来提供相同的通道mediator.fire('error:Validation', 'Field is invalid!')

我一直使用的 Addy 帖子中的 Facade 理论上可以简单地将请求转发到 Core。可能,它会检查频道信号中的某些内容,以确保,比如说,Finch 没有试图啄食会使其生病的幼虫——例如抛出异常。

这就是为什么为您的核心拥有一个单独的通道媒介(即中介)可能是有意义的,您的 Facade 是核心的唯一“引用者”——并且您的模块只引用 Facade。另一种方法是在您的团队中强制执行离散通道名称的约定,例如mediator.fire('ready://Core')& mediator.fire('updated://ToDos/task', taskId)。Thefacade会听'updated://ToDos/task'并会向 -- 发出请求,core这可能看起来像:

var thus = mediator.installTo(this);
this.on('updated://ToDos/task', function(id){
    thus.fire('request://Core/save/todo', id);
    thus.fire('user://Core/notify/task/added', id);
});
this.on('response://Core/save/todo', function(err, id){
    if(!err){
        // ... success -- notify module!
    } else {
        // ... notify for failure :(
    }
});

注意力!直接在侦听器调用中编写处理程序!

真的希望这会有所帮助,并且我不会因为谈论鸟类而被否决;)

于 2015-02-25T21:12:47.237 回答