【问题标题】:Using decorator design pattern to create a doubly linked list by decorating a singly linked list使用装饰器设计模式通过装饰单链表来创建双向链表
【发布时间】:2017-02-05 07:29:54
【问题描述】:

在设计模式方面我是个新手,所以很难掌握装饰器设计模式的概念。是否可以将单链表类装饰为继承自它的双向链表类?我想装饰以下类:

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

为双向链表类提供相同的功能,并添加了一个带有指向前一个节点的指针的结构。

希望有人可以阐明如何做到这一点。提前致谢。

【问题讨论】:

  • 双链表需要实现什么接口?
  • @Slava 与 ListAsSLL 完全相同的界面
  • 那你不明白装饰器模式是干什么用的。当您需要一个接口而您有另一个接口时使用它。因此,您使用装饰器来提供所需的接口。您正在尝试做的事情与装饰器模式完全无关。
  • @Slava 这就是我如此困惑的原因。我在作业中得到了这个。他们说ListAsDLL是通过装饰ListAsSLL实现的。我根本看不到 ListAsSLL 是如何被装饰的。
  • 只需从ListAsSLL 继承ListAsDLL 并在那里继承struct node(添加另一个指针prev)。然后相应地重新实现所有虚拟方法(您应该调用父方法,然后在派生方法中修改prev,使其指向前一个元素)。

标签: c++ design-patterns decorator singly-linked-list doubly-linked-list


【解决方案1】:

这是一个如何实现它的示例。我添加了另一个虚拟方法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;
    }
    ...
};

代码没有经过测试,虽然可能有逻辑错误,写出来是为了展示总体思路。

【讨论】:

    猜你喜欢
    • 2011-04-12
    • 2012-04-18
    • 2011-12-25
    • 2010-10-05
    • 1970-01-01
    • 2013-05-07
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多