使用动机:
由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个维度的变化。
class MessagerImpl
{
public:
~MessagerImpl() { }
public:
virtual void PlaySound() = 0;
virtual void WriteText(string &msg) = 0;
virtual void Connect() = 0;
};
class Messager
{
public:
Messager(MessagerImpl *pMessagerImpl) : m_pMessagerImpl(pMessagerImpl) { }
~Messager() { }
public:
virtual void Login(string &name, string &pwd) = 0;
virtual void SendMsg(string &msg) = 0;
protected:
MessagerImpl *m_pMessagerImpl;
};
// PC平台实现
class PCMessager : public MessagerImpl
{
public:
virtual void PlaySound() { }
virtual void WriteText(string &msg) { }
virtual void Connect() { }
};
// Mob平台实现
class MobMessager : public MessagerImpl
{
public:
virtual void PlaySound() { }
virtual void WriteText(string &msg) { }
virtual void Connect() { }
};
// 业务抽象(精简版)
class PCMessagerLite : public Messager
{
public:
PCMessagerLite(MessagerImpl *pMessagerImpl) : Messager(pMessagerImpl) { }
public:
virtual void Login(string &name, string &pwd)
{
m_pMessagerImpl->Connect();
}
virtual void SendMsg(string &msg)
{
m_pMessagerImpl->WriteText(msg);
}
virtual void PlaySound()
{
m_pMessagerImpl->PlaySound();
}
};
// 业务抽象(专业版)
class PCMessagerPerfect : public Messager
{
public:
PCMessagerPerfect(MessagerImpl *pMessagerImpl) : Messager(pMessagerImpl) { }
public:
virtual void Login(string &name, string &pwd)
{
m_pMessagerImpl->PlaySound();
m_pMessagerImpl->Connect();
}
virtual void SendMsg(string &msg)
{
m_pMessagerImpl->PlaySound();
m_pMessagerImpl->WriteText(msg);
}
virtual void PlaySound()
{
m_pMessagerImpl->PlaySound();
}
};
int main(array<System::String ^> ^args)
{
MessagerImpl *pMessagerImpl = new PCMessager();
Messager *pMessager = new PCMessagerLite(pMessagerImpl);
pMessager = new PCMessagerPerfect(pMessagerImpl);
pMessagerImpl = new MobMessager();
pMessager = new PCMessagerLite(pMessagerImpl);
pMessager = new PCMessagerPerfect(pMessagerImpl);
return 0;
}