技术开发 频道

Windows Mobile下的重力感应器开发

 Sensors工厂

 Client不需要知道具体那个厂家(HTC or Samsung)的Sensor,只需要调用工厂类生成Sensor类。

 

 class GSensorFactory

 {

 public:

 static IGSensor* CreateGSensor();

 };

 IGSensor* GSensorFactory::CreateGSensor()

 {

 try

 {

 return SamsungGSensor::GetInstance();

 }

 catch(...)

 {

 }

 try

 {

 return HTCGSensor::Create();

 }

 catch(...)

 {

 }

 return NULL;

 }

 自动生产相应的Sensor的对象。

  LRESULT CSensorTesterView::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)

 {

 gSensor = GSensorFactory::CreateGSensor();

 if(NULL == gSensor)

 {

 MessageBox(L"Can not Initialise GSensor.");

 }

 return TRUE;

 }

 Client只是调用工厂类生产Sensor对象。

 Observer模式

 为Client提供一个当GVector发生改变时自动通知更新的功能,这里使用了Observer模式,我使用了一个开源的类 Experiences of Implementing the Observer Design Pattern (Part 3) ,这个类具有很多优点,类型安全(type safe),泛型(generic),任意参数类型和任意参数数量,回传Sender的指针等等, 代码在这里下载http://tse3.sourceforge.net/doc/api/TSE3__Notifier.html

 class IGSensor;

 /**

 *  Oberver interface for Gravitation Sensor.

 *

 */

 class IGSensorListener

 {

 public:

 typedef IGSensor notifier_type;

 virtual void IGSensor_GVectorChanged(IGSensor* gSensor, GVector gVector) {};

 };

  这是Listener,也就是我们常说的Abstract Observer。需要定义notifier_type和定义回调接口。

  /**

 *  Interface of Gravitation Sensor.

 *

 */

 class IGSensor :

 public Notifier<IGSensorListener>,

 public ThreadTask

 {

 public:

 IGSensor(void);

 ~IGSensor(void);

 public:

 virtual GVector GetGVector() = 0;

 virtual void Register() = 0;

 virtual void Unregister() = 0;

 protected:

 void GVectorChanged(GVector gVector);

 };

 这是Notifier也就是Subject,需要继承 Notifier<IGSensorListener>。

 class CSensorTesterView :

 public Listener<IGSensorListener>

 {

 public:

 virtual void IGSensor_GVectorChanged(IGSensor* gSensor, GVector gVector) override;

 LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

 };

 LRESULT CSensorTesterView::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)

 {

 gSensor->Register();

 attachTo(gSensor);

 return TRUE;

 }

  上面显示的是client类,为了演示把一些Observer模式无关的代码删除掉,完整代码可以下载源代码。client类需要继承public Listener<IGSensorListener>,重写IGSensor_GVectorChanged()函数和调用attachTo()函数进行注册。

作者:Jake.NET

查看原文地址

0
相关文章