一、裝飾模式
用戶使用代碼:
//基類
class Subject
{
public:
virtual void operation();
};
//具體類
class ConcreteSubject : public Subject
{
public:
virtual void operation();
};
//裝飾類
class Decorate : public Subject
{
public:
Decorate(Subject* pSubject);
virtual void operate();
private:
Subject* m_pSubject;
};
//具體裝飾類
class ConcreteDecorate : public Decorate
{
public:
ConcreteDecorate(Subject* pSubject);
virtual void operate();
};
ConcreteDecorate(Subject* pSubject)
:Decorate(pSubject)
{
}
void ConcreDecorate::operate()
{
//other operation
//otheroperate();
super.operate();
}
int main()
{
Subject* pSubject = new ConcreteSubject();
Decorate* pDecorate = new ConcreteDecorate(pSubject);
pDecorate->operation();
return 0;
}
二、代理模式
代碼示例:
//基類
class Subject
{
public:
virtual void operation();
};
//具體類
class ConcreteSubject : public Subject
{
public:
virtual void operation();
};
//代理類
class Proxy : public Subject
{
public:
virtual void operation();
private:
ConcreteSubject m_objConcreteSubject;
};
void Proxy::operation()
{
m_objConcreteSubject.operation();
}
int main()
{
Subject* pSubject = new Proxy();
pSubject->operation();
}
三、對比
從類圖關係來看,裝飾模式中由Decorate類聚合Subject類,用戶使用時,需要自己構造Subject實例,然後將Subject實例作爲Decorate構造函數參數傳入Decorate,Decorate實例在實現具體操作時,除了調用Subject的操作函數還添加補充操作函數,起到“裝飾”的作用。代理模式中Proxy類負責Subject實例的構造和銷燬,用戶在使用過程中不用直接操作Subject具體實例,由Proxy來負責實現具體的操作。
裝飾模式主要強調對Subject類功能的擴展,而代理模式側重於對Subject類的訪問控制。