上一篇博文,只是简单地将通用的接口和可选接口分离出来,然而,如果同一个ScanDongle这个行为,方案商有多种实现方案,比如对查找dongle这一接口可以有如下几种具体实现方式,甚至更多:
ScanDonglebyRC
ScanDonglebyBlutooth
ScanDonglebyNEC
那么我们需要为其设计一个框架,使得方案商可以很方便地控制每一个接口的具体实现,这里我们当然就不用继承而采用接口的方式了:
这样的设计的好处在于:gcanDongle,还有getDongleInfo这种行为和方案商没有了直接关系,实现了解耦,新增行为接口和新增方案商不会互相影响
而如果这样设计了的话,就要考虑到方案商对这些具体实现的调用。
我们看下现在的方案商设计:
加入实例变量以在运行时引用正确的行为类型
用大的表示一类行为的方法来取代具体的行为,这也是便于运行时确定具体行为
将接口申明为纯虚函数,接口为纯虚类,以便具体方法继承此此接口来实现具体的行为
类中有一个接口的实例变量IScanDongle和一个接口的行为函数void ScanDongle(),在接口行为函数ScanDongle的具体实现中(.cpp文件)才将接口的实例变量实例化,达到运行时指定具体行为的目的
首先定义方案商基类:
class BaseVendor : public BasePolicy{
public:
BaseVendor();
~BaseVendor();
<span style="color:#ff0000;">IScanDongle *iScanDongle;</span>
virtual void scanDongle() = 0;
virtual void getDongleInfo()=0;
};
这里在将行为接口IScanDongle *iScanDongle放在了基类中
然后定义一个行为簇的基类,比如扫描Dongle这个行为有很多种具体实现方式,那么为这个行为簇设计一个基类:
class IScanDongle : public BaseInterface
{
public:
/** Default constructor */
IScanDongle();
/** Default destructor */
virtual ~IScanDongle();
virtual bool scanDongle() = 0;
};
之后,实现一些具体的行为算法,供具体调用:
class ScanDonglebyBluetooth : public IScanDongle
{
public:
/** Default constructor */
ScanDonglebyBluetooth();
/** Default destructor */
virtual ~ScanDonglebyBluetooth();
bool scanDongle();
protected:
private:
};
然后方案商可以针对这个类来实现具体的方案商类,比如方案商Iflytek的实现:
class VendorIflytek : public BaseVendor,public PolicyIflytek{
public:
VendorIflytek();
~VendorIflytek();
void scanDongle();
void getDongleInfo();
void setDongleToNomalMode();
};
方案商只是简单继承了基类BaseVendor而已,因为有从基类继承而来的iScanDongle,通过它就可以方便地选择scanDongle的具体实现方式了,比如:
void VendorIflytek::scanDongle(){
LOGE("VendorIflytek::ScanDongle");
iScanDongle = new ScanDonglebyBluetooth();
iScanDongle->scanDongle();
}
验证一下:
//create a vendor
BaseVendor *vendor = new VendorIflytek();
//excute a vendor behavior
vendor->scanDongle();
我们可以看到,如果方案商对scanDongle()这一行为的具体实现方式是蓝牙(在CPP文件中进行的具体实现),那么就可以看到,对蓝牙的scanDongle方法的调用了
到这里说了这么多,其实就是用了策略模式对算法簇进行封装,让他们之间可以互相替换,让算法的变化独立于使用算法的客户。