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