作为装饰器的集合:伪代码实现提议

时间:2010-06-28 14:22:43

标签: c# java collections aop

同时等待question上的答案我想讨论可能的实施计划/细节,或者一般来说甚至回答实施以下内容有多难以及为此需要哪些工具/技术: / p>

(摘自引用的问题):

  

假设你需要实现许多   (子)类型的集合。其中一个   方面是与存储相关的列表,   数组等,而另一个是   与行为相关已订购已删除   只有可观察(发射的那个)   每次改变时的事件)等。

     

显然(再次),要求   直接映射到众所周知的   装饰器设计模式,其中存储相关   方面 list array )将由多个装饰   行为有序可观察等)。

到目前为止,我想在(类似Java)的伪代码中提出一些相当短的实现,同时询问是否可以在Java或C#中实现以下内容,如果没有,则在任何其他现代编程语言中实现:

每个集合必须支持的基本界面:

interface Collection {
    [mutator]
    public void add(object o);

    [mutator]
    public void remove(object o);

    [accessor]
    public object get(int i);
}

存储方面:

列出实施:

class List : Collection {
    [mutator]
    public void add(object o) { ... }

    [mutator]
    public void remove(object o) { ... }

    [accessor]
    public object get(int i) { ... }
}

数组实施:

class Array : Collection {
    [mutator]
    public void add(object o) { ... }

    [mutator]
    public void remove(object o) { ... }

    [accessor]
    public object get(int i) { ... }
}

行为方面:

线程安全的装饰器:

typename<T> : where T is Collection
class ThreadSafe : Collection {
    private T m_source;
    private object m_lock = new object();

    [mutator]
    public void add(object o) { 
        using (m_lock) {
            m_source.add();
        }
    }

    [mutator]
    public void remove(object o) { ... }

    [accessor]
    public object get(int i) { ... }
}

Observable 装饰者:

class ChangeEvent {
    public Collection Source { get; private set; }
    public Method UpdateType { get; private set; }
}

interface Observer {
    public notifyChange(ChangeEvent e);
}

typename<T> : where T is Collection
class Observable : Collection {
    public Observer Observer { get; set; } // additional property
    private T m_source;

    [mutator]
    public void add(object o) {
        if (Observer != null) {
            var event = new ChangeEvent() { Source = this, UpdateType = GetCurrentMethod() };
            Observer.notifyChange(event);
        }
        m_source.add(o);
    }

    [mutator]
    public void remove(object o) { ... }

    [accessor]
    public object get(int i) { ... }
}

Ordered 装饰者:

typename<T> : where T is Collection
class Ordered : Collection {
    private T m_source;

    [mutator]
    public void add(object o) {
        int idx = findProperPosition(); // assumed possible using the base Collection interface
        ...
        m_source.add(o);
    }

    [mutator]
    public void remove(object o) { ... }

    [accessor]
    public object get(int i) { ... }
}

只读装饰者:

typename<T> : where T is Collection
class ReadOnly : Collection {
    private T m_source;

    [mutator]       
    public void add(object o) { throw IllegalOperationException(...); }

    [mutator]
    public void remove(object o) { throw IllegalOperationException(...); }

    [accessor]
    public object get(int i) { return m_source.get(i); }
}

到目前为止,上面只是伪代码,但目标是使客户端代码能够构建多种集合,这样每种类型都可以合并一个存储方面任意数量的行为相关方面。能够在编译时构造这些复合类型并且非常方便在运行时生成这些复合类型会非常好。

问题是(任何现代编程语言如何计算)?

1 个答案:

答案 0 :(得分:0)

我不明白你不理解的方面。 Java集合已经具有此功能,源代码是公共的。具有线程安全和不可修改的装饰器。此外,许多类型都有fascade方法,例如“asList()”。

鉴于此,您的问题还剩下什么?

如何制作未订购的商品?比如,如何创建一个将HashMap转换为LinkedHaskMap的装饰器?这样的装饰器可以用内部数据结构构建,以维持秩序。