在这个站点上有很多关于Symbian程序外表的文章,很少有关于架构设计的观点。在以下的文中中,我介绍一下在Symbian应用程序中的观察者模式,我会用一些有意义的类名来代表整个Symbian程序的设计流程。在这个应用程序中,将告诉你在一个Symbian程序中如何使用 Engine和前台,UI接口,和用户直接的交互。在文章中,我已经给了一种解决的方案。在接下来的文章种,我将介绍另外一种方法,通过内嵌类。让我们开始应用程序的引擎类和它的观察者,我们创建了一个观察者接口 MObserver,定义如下:
class MObserver
{
public:
virtual void CallbackFunction1() = 0;
};
接口,它有一个纯虚函数,它必须被一个创建类实现。在我们的例子中,Engine(引擎类)将实现它:
class Engine : public MObserver
{
public: Engine(CAppUi& aAppUi);
void CallbackFunction1();//From MObserver
void DoSomething();
Subject& GetSubject();
private: Subject* iSubject;
CAppUi& iAppUi;
};
从名字可以清晰的看出,Engine类有一个Subject类,他是实际上在后台工作的类;CAppUi 类是核心与视图的用户接口。引擎创建一个Subject类,通常在Symbian程序中,CAppUi 类是通过veiw类表现数据到用户接口的(UI)。
Subject类申明如下:
class Subject
{
public:
Subject(MObserver& aObserver);
void DoSomething();
private:
MObserver& iObserver;
};
很明显,Subject类链接了它的观察者iObserver。Symbian程序在一般情况下,在后台通过一些异步函数,Subject类将继承至CActive类而工作。这里有一个 DoSomething()将调用一些异步函数,这个函数也将调用MObserver中的CallbackFunction1()。CallbackFunction1 函数将更新AppUi 应用程序或引擎和UI中相关的表现形式。因此让我们来看看CAppUi类的申明:
class CAppUi
{
public:
CAppUi();
Engine& GetEngine();
void PrintToUI(char* msg);
virtual ~CAppUi();
private:
Engine* iEngine;
};
AppUi类的作用是,创建应用程序的引擎。记住,应用程序和Engine已经循环的引用,整个的流程如下:
AppUi将创建引擎;
Engine创建Subject;
AppUi通过一些菜单命令调用Engine中的DoSometing函数;
Engine将委派一些任务通过Subject类的DoSometing函数;
Subject的DoSometing函数将通知通过CallbackFunction1创建Observer;
Subject的DoSometing函数看上去如下:
void Subject::DoSomething()
{ //Call the Asynchronous function
//Now Notify the Observer regarding this.
iObserver.CallbackFunction1();
}
Observer中的这个回调函数将打印AppUi中消息通过函数PrintToUi。这个函数将呈现从Engine得到的消息到Veiw中。
希望这篇文章能讲清楚一些Symbian入门者对于如何使用UI的疑惑。