裝飾模式和代理模式對比

一、裝飾模式

用戶使用代碼:

//基類
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類的訪問控制。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章