使用动机:
由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个维度的变化。
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;
}