首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >集合作为装饰器:伪代码实现方案

集合作为装饰器:伪代码实现方案
EN

Stack Overflow用户
提问于 2010-06-28 14:22:42
回答 1查看 465关注 0票数 1

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

(摘自上述问题):

假设您需要实现许多(子)类型的集合。其中一个方面是storage-related:列表、数组等,而另一个方面是behavior-related:排序、只删除、可观察的(在每次更改时触发事件的)等等。

显然(再次),需求直接映射到众所周知的Decorator设计模式,其中与存储相关的方面(列表、数组)将由多个行为(有序、可观察等)来修饰。

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

每个集合必须支持的基本接口:

代码语言:javascript
复制
interface Collection {
    [mutator]
    public void add(object o);

    [mutator]
    public void remove(object o);

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

存储方面:

清单执行情况:

代码语言:javascript
复制
class List : Collection {
    [mutator]
    public void add(object o) { ... }

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

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

数组实现:

代码语言:javascript
复制
class Array : Collection {
    [mutator]
    public void add(object o) { ... }

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

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

行为方面:

线程安全装饰器:

代码语言:javascript
复制
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) { ... }
}

可观察的装潢师:

代码语言:javascript
复制
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) { ... }
}

定购装潢师:

代码语言:javascript
复制
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) { ... }
}

只读装饰师:

代码语言:javascript
复制
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); }
}

到目前为止,上面的只是伪代码,但目标是使客户端代码能够构造多种集合,这样每种代码都可以将任意数量的behavior-related方面的存储方面组合在一起。如果能够在编译时构造这些组合类型,并且能够在运行时生成这些类型,那就太好了。

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

EN

回答 1

Stack Overflow用户

发布于 2011-10-08 03:27:59

我不明白你是怎么不明白的。Java集合已经具备了这个功能,并且源代码是公共的。有用于线程安全和不可修改的装饰器。而且,许多类型都有"asList()“之类的such方法。

既然如此,你的问题还剩下什么?

如何制作没有订购的东西?例如,如何创建一个将HashMap转换为LinkedHaskMap的装饰器?可以使用内部数据结构来构建这样的装饰器来维护秩序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3133176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档