浅谈BREW对面向对象,Windows,Java,设计模式的借鉴
毛晓冬 2007-1-26
一、 使用接口机制:
借鉴了面向对象的接口,类封装服务。BREW向App提供的所有服务以接口体系存在。客户需要使用服务时,首先请求BREW创建类的实体,并得到对应的接口实例。然后才能使用接口的服务。
使用接口体系,在C中模拟了面向对象。封装了变化点,使得接口与实现得以分离,迎合了动态加载的必然要求。同时也是面向对象和设计模式的总体思想。
二、 使用工厂模式:
借鉴了设计模式中的工厂模式。封装了类实体的创建过程,向客户彻底屏蔽类的具体实现,达到接口与实现的分离。BREW中,具体的类,接口实例的创建,都是通过Ishell这个工厂创建的,只需要传入ClsId表征具体需要创建的是哪个对象。
三、 使用CLSID,Interface ID:
借鉴了COM中的GUID,用来唯一的标识具体的类和接口,从而请求创建或者查询。
四、 QueryInterface机制:
借鉴了COM中的QueryInterface机制,可以通过组件的一个接口查询出另一个接口。在BREW中,可以实现向下兼容的条件下,提供扩展功能。
五、 引用计数:
借鉴了COM中的引用计数。允许同一个接口实例,被多个客户同时使用。引用计数可以控制实例的生命周期何时结束,何时释放,保证客户使用时,实例都是有效的。
六、 内存自动回收:
借鉴了Java中的自动垃圾回收。BREW中,当一个Module的所有App,Extensions Unload时,BREW可以自动的检查出,有哪些在App环境下申请的内存没有被释放,此时BREW会自动释放,回收。实现基本原理是,在一个Module的环境下运行的任何App,申请的内存Node,都会自动关联上Module ID,这样,当Module Unload时,BREW可以检查出哪些内存Node还没有被释放。
七、 事件驱动,消息循环:
借鉴了Windows的事件驱动和消息循环。Windows中,App需要向Windows注册WindowProc,即所谓的窗口过程。Windows有消息发给该App时,就会调用这个窗口过程,在窗口过程中,App进行消息分发处理。BREW中,BREW内核向Task注册窗体过程AEE_Dispatch,App向BREW注册HandleEvent。当Task允许BREW执行时,会调用AEE_Dispatch,此时BREW再将消息分发到App的HandleEvent。具体可以参考笔者的 《BREW Vs Windows》
八、 Hook机制:
借鉴了Windows中的Hook技术。在Windows中,消息默认分发给当前运行的App,但是可以通过安插鼠标Hook,键盘Hook等,截获事件。BREW中,可以通过注册Key Hook,截获发往Top Visable App的Key Event
九、 Register Notify,BUIW Model<->Listener:
借鉴了Jave的Listener机制,或者说设计模式中的Observer模式。使得一个组件可以向另一个组件注册监听,当变化发生时,可以自动通知
十、 BUIW整体架构:
借鉴了MVC设计模式,将数据的存储,处理和最终的显示输出强行隔离,通过Controler来进行逻辑调度。在BUIW中,Model对应MVC中的Model,Widget对应MVC中的Viewer+轻量级的Controler
十一、 Container:
BUIW中的Container借鉴了设计模式中的Composite模式,使得对部分和整体的操作达到一致性。在BUIW中,是通过Container Query出Widget来达到这个目的的
十二、 AdaptGet,AdaptSet:
BUIW中,ValueModel的AdaptGet,AdaptSet功能借鉴了设计模式中的Adaptor模式。主要作用是,当一个组件的接口不满足客户的接口规格,而客户又想使用时,可以通过一个Adaptor(适配器)来达到自动适配。
十三、 Decorator:
BUIW中的Decorator,借鉴了设计模式中的Decorator模式,主要作用是,对单独的一个组件,进行外观,行为上的修饰。
十四、 IMedia,IImage等抽象接口:
借鉴了面向对象中的多态,使得具体媒体格式的Class,都继承至Imedia,Iimage这两个抽象接口。对上层是统一的接口表现,在运行时,多态的调用具体媒体格式Class的接口。
十五、 Register Handler,GetHandler机制:
借鉴了Windows中,类型自动关联的机制。当打开一个特定的MIME类型时,Windows可以自动启动特定的程序去处理。在BREW中,同样通过Register Handler可以使得App或者Interface自动和MIME类型关联。当针对特定MIME类型操作时,可以通过GetHandler查询出该MIME类型关联的Class或者App,从而启动App或者创建Class来处理该媒体类型。