0

當談到設計模式時,我非常新手,所以我很難掌握裝飾設計模式的概念。是否有可能裝飾一個單鏈表的類到一個雙鏈表的類繼承它?我想裝點以下類:使用裝飾設計模式通過裝飾單個鏈接列表來創建雙向鏈接列表

ListAsSLL.h:

#ifndef LISTASSLL_H 
#define LISTASSLL_H 

class ListAsSLL 
{ 
protected: 
    struct node{ 
     int i; 
     struct node* next; 
    }; 
    node* head; 
    node* tail; 
    int listSize; 

public: 
    ListAsSLL(); 
    virtual void addToBeginning(int obj); 
    virtual void addAtPos(int obj, int i); 
    virtual void addToEnd(int obj); 
    virtual void del(int i); 
    virtual void overwrite(int obj, int i); 
    virtual void grow(); 
    virtual void shrink(); 
}; 

#endif //LISTASSLL_H 

給雙向鏈表類具有帶指向前一節點的結構的附加功能相同的功能。

希望有人可以闡明如何做到這一點。提前致謝。

+0

你需要實現雙鏈表的接口是什麼? – Slava

+0

@Slava與ListAsSLL完全相同的界面 – Keagansed

+0

然後你不明白裝飾模式是用於什麼。當你需要一個接口並且你有另一個接口時使用它。所以你使用裝飾器來提供所需的接口。你試圖做什麼完全無關裝飾模式。 – Slava

回答

0

下面是一個如何實現它的例子。我添加了另一個虛擬方法createNode並顯示addToBeginning()的可能實現。

class ListAsSLL 
{ 
protected: 
    struct node{ 
     int i; 
     struct node* next; 
    }; 
    node* head; 
    node* tail; 
    int listSize; 

    virtual node *createNode() { return new node; } 
public: 
    virtual void addToBeginning(int obj) 
    { 
     node *node = createNode(); 
     node->i = obj; 
     node->next = head; 
     if(!head) tail = node; 
     head = node; 
     ++listsize; 
    } 
    ... 
}; 

class ListAsDLL 
{ 
protected: 
    struct dnode : node{ 
     node* prev; 
    }; 

    virtual node *createNode() { return new dnode; } 
public: 
    virtual void addToBeginning(int obj) 
    { 
     node *prevHead = head; 
     ListAsSLL::addToBeginning(obj); 
     static_cast<dnode *>(head)->prev = prevHead; 
    } 
    ... 
}; 

代碼沒有經過測試,雖然可能有邏輯錯誤,正如寫出來顯示一般想法。