摆脱单身人士?

时间:2011-10-03 23:36:36

标签: javascript oop singleton

我正在编写一个过于复杂的网络应用程序,我想简化我的组件协同工作的方式。我有一些单身人士“知道”他们所要处理的所有物品。

例如,我有一个windowSystem,其中包含存在的所有window个对象的数组。所有的窗户对彼此一无所知,但我有一个令人恼火的单身人士,比如closeAllWindows()函数或if(sameWindowExists()) { return }类型的东西(我认为)需要某种方式来保持跟踪所有windows。我的程序启动时创建了一个windowSystem实例。

感觉这些是不必要的,因为他们知道的比他们应该的更多。我还有其他选择吗?

修改:以下是一些显示各种_____System

的创建的代码
var refDate = usDate.now();

    var eventSystem = usEventSystem($("#topLevelElement")),
        backend = usBackend(eventSystem.trigger),
        windowSystem = usWindowSystem($("#windows"), eventSystem.registerEvent),
        timelineSystem = usTimelineSystem($("#view"), 
                                        backend.getEvents, 
                                        usDate.now().shift({ hours:-6 }), 
                                        usDate.now().shift({ hours:6 }),
                                        eventSystem.registerEvent,
                                        eventSystem.unregisterEvent,
                                        windowSystem.createWindow);

    usWindow.setRegisterEventFunc(eventSystem.registerEvent).setUnregisterEventFunc(eventSystem.unregisterEvent);                           

我真正不喜欢的是我将其他系统中的许多函数传递给对方(然后他们将这些函数传递给对象 - 就像window - 他们创造的那样 - 并没有'似乎规模很大。

2 个答案:

答案 0 :(得分:0)

手动依赖注入可由一个单身人士提供。我知道你正试图摆脱这些,但如果你有一个跟踪所有有趣的实例(如窗口),你可以说Injector.get("Window", "Debug");之类的东西来抓取你的调试代码想要的任何窗口实例。这仍然为您提供注入 - 如果需要,可以向Debug类提供不同的窗口,并且可以通过多种方式(数据,硬编码等)配置提供的类实例的配置。

然后,您也可以使用Injector.getAll("Window")来获取和关闭它们。

我意识到你还有一个单身人士,但至少它只是一个,它为你提供了一些灵活性,可以在一个地方重新配置你的课程。

答案 1 :(得分:0)

您可以尝试将其转移到所有窗口继承的基类,而不是让您的窗口在窗口上方的单例中管理逻辑。它可能看起来像:

function BaseWindow() {
    //whatever common constructor logic you may want
    //such as creating an id
    this.id = this.id + 1
}

//this is static
BaseWindow.activeWindow = null;

//this is a property visible to each window instance but is updated by the base class
BaseWindow.prototype.id = 0;

//this is a property visible to each window instance but may be overridden by a subclass
BaseWindow.prototype.name = "BaseWindow";

//this is function visible to each window instance
BaseWindow.prototype.show = function ( ) {
    //hide BaseWindow.activeWindow then show "this" window;
};


function WindowA() {
    //do some window specific stuff like set the window name
    this.name = "WindowA";
}

WindowA.prototype = new BaseWindow;