Коллекции как декораторы: предложение по реализации псевдокода - PullRequest
1 голос
/ 28 июня 2010

В ожидании ответа на вопрос Я хотел бы обсудить возможный план / детали реализации или вообще даже ответить, насколько сложно будет реализовать следующее и какие инструменты / методы необходимы для этого.:

(выдержка из указанного вопроса):

Предположим, вам необходимо реализовать множество (под) типов коллекций.Одним из аспектов является связанный с хранилищем : список , массив и т. Д., В то время как другой связанный с поведением : упорядочен, удалить только , наблюдаемый (тот, который запускает событие при каждом изменении) и т. Д.

Очевидно (снова), требование отображается непосредственно нахорошо известный шаблон проектирования Decorator , где аспект , связанный с хранением * ( список , массив ), будет украшен несколькими Поведенческий ( упорядоченный , наблюдаемый и т. д.).

Пока что я хотел бы предложить некоторую достаточно короткую реализацию в (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) { ... }
}

Наблюдаемый Декоратор:

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) { ... }
}

Заказано Декоратор:

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 голосов
/ 08 октября 2011

Я не понимаю, какой аспект того, что вы не понимаете.Коллекции Java уже имеют это, и источник общедоступен.Имеют декораторы для многопоточных и неизменяемых.Кроме того, во многих типах есть такие методы-фасады, как "asList ()".

Учитывая, что осталось от вашего вопроса?

Как сделать что-то не упорядоченным, упорядоченным?Мол, как создать декоратор, который превращает HashMap в LinkedHaskMap?Такой декоратор может быть построен с внутренней структурой данных для поддержания порядка.

...