Symbian程序的Observer规范 - [symbian]

来源:互联网 发布:电脑mac地址怎么改 编辑:程序博客网 时间:2024/05/21 10:05

Symbian程序的Observer规范 - [symbian]

2009-07-06

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://iovi.blogbus.com/logs/41972701.html

在以下的文章里我将给大家抛砖引玉,告诉大家Observer规范通常是怎么样在一个正常的Symbian程序执行的。我尝试着用有意义的名字来给类命名来模拟整个设计过程,因此这样更能形象化的代表整个Symbian程序的流程,在这个例子中我将通过模型来解释engine和front end UI 之间的相互作用并因此来展现UI到用户的响应,在这篇文章中我将给出一种方法来解答,以后的文章里我将给出另一种方法通过嵌套类来解答,让我们开始讲解以下例子的Engine类和他的Observer,我们把Observer用MObserver代替,它的定义如下:
class MObserver
{
public:
        virtual void CallbackFunction1() = 0;
};
显而易见它有个纯虚函数,这个纯虚函数只能被有形类执行,在我们的例子中Engine就是执行它的有形类,以下是Engine的代码
class Engine : public MObserver
{
public:        Engine(CAppUi& aAppUi);
        void CallbackFunction1();//From MObserver
        void DoSomething();
        Subject&  GetSubject();
private:        Subject*  iSubject;
        CAppUi&  iAppUi;
};
通过那些类里的名字很明显的看出,Engine类涉及到Subject类,它是隐含调用的(which will actually do the work in the background)(Sorry,我不知道怎么翻译才顺口),CAppUi类,它是贯穿程序整个生命周期的类,Engine类它实际上是创建Subject类,在一般的Symbian程序里CAppUi类是通过View类来响应,为在UI中展现数据。

现在让我们来谈谈Subject类,它的声明如下:

class Subject 
{
public:
        Subject(MObserver& aObserver);
        void DoSomething();
private:
        MObserver& iObserver;
};
显而易见,Subject类和Observer相连,通常在正常的Symbian程序中,Subject类是基于CActive类,Subject通过一些异步函数隐藏工作。那些异步函数也将会调用MObserver的CallbackFunctio1()函数,因此它基本的工作就是函数调用和GoF(由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著的Design Patterns)所写的那本书中的提到的一样,CallbackFunction1函数实际上是让application或engine更新AppUi的当前状态并且UI将做出相应,让我们看看CAppUi类是怎样声明的:
class CAppUi
{
public:
        CAppUi();
        Engine& GetEngine();
        void PrintToUI(char* msg);
        virtual ~CAppUi();
private:
        Engine* iEngine;
};
AppUi的任务是创建程序的engine,请记住,Application和Engine是循环相互作用的,它的整体流程如下:
1.        AppUi创建Engine
2.        Engine创建Subject
3.        AppUi将通过菜单命令调用Engine的DoSomething函数
4.        The engine will delegate this task to the DoSomething function of the Subject
5.        Subject的DoSomething函数将通过CallbackFunction1函数告诉有形的observer类(在这里即Engine类)
Subject的DoSomething函数代码如下
void Subject:DoSomething()
{        //Call the Asynchronous function
        //Now Notify the Observer regarding this.
        iObserver.CallbackFunction1();
}
Observer的Callback函数实际上将通过函数PrintToUi在AppUi里打印消息,事实上Callback函数传递来自View的Engine消息。(以上原文出自NewLC written by
somenath mukhopadhyay)
为了更好的理解我到网上找到些相关的资料(来自标题为:设计模式之观察者模式 的一篇文章):举例说明例如:我们可以使用图形、表格或者列表框显示股票的价格,当股票的价格发生改变时,我们期望同时很方便的更改其它部分。
在这种情况下我们就可以使用Observer模式。我们可以很容易的利用Observer模式使我们的程序可以很方便的解决上面的问题
当我们要实现Observer模式时,通常将数据对象作为目标(Subject),各个显示数据的对象作为观察者(Observer)。每一个观察者(Observer)通过调用目标(Subject)中的一个公有(public)方法,在他所感兴趣的数据中注册(registers)自己。这样,当数据改变时,每一个目标(Subject)通过观察者(Observer)的接口发送更新通知。。


原创粉丝点击