想象一个场景:
你要开发一个门锁, 设计好了锁的很多细节: 安全级别, 大小, 外观, 跟什么门相配, 使用细节等等, 但你只是一个设计公司, 这没有关系,
因为在细节都决定好了之后, 只要找一家生产商合作按照你的设计要求来做就ok了, 当然你需要严格的验收测试.
上面那场景是我编造的, 重点是分离了接口的设计和实现.
接口的设计: 这个class需要提供什么信息, 使用者可以通过这些接口得到使用这个class所需要的一切. 注意是使用这个class所需要的, 而不是解构分解这个class所需要知道的一切.
接口的实现: 这是怎么实现, 用什么方法实现, 可能不同的算法, 没有关系, 使用者没有必要知道, 于是这些也没有必要让使用者接触到.
LockManager.h
class LockManager {
LockManager() { sLockManager = this; };
static LockManager &instance() { return sLockManager; };
static LockManager sLockManager;
virtual int getInformationX() const { ...; };
virtual int getInformationY() const { ...; };
};
LockManager.cpp
LockManager *LockManager::sLockManager = NULL;
class LockManagerAImp : public LockManager
{
LockManagerAImp() : LockManager() {};
virtual int getInformationX() const { ....; };
virtual int getInformationY() const { ....; };
};
class LockManagerBImp : public LockManager
{
....
};
使用时候:
根据不同的情况判断使用不同的实现,
if (xx) new LockManagerAImp;
if (yy) new LockManagerBImp;
然后使用者就可以一直使用LockManager class里面的函数, 而根本不知道也不用知道地下是哪个的实现.
LockManager::instance().getInformationX();
LockManager::instance().getInformationY();
这是阅读代码时候抽象改动出来的.