Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Композиция vs Делегирование 
:(
    Опции темы
initmax
Дата 13.10.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Перерыл инфы, пытаюсь разобраться в нижеизложеных понятиях, если чего не верно/полно прошу подправить

0) Делегирование :  Создание классов с использованием объектов сторонних классов, например

Код

class A {
    void f() {
        System.out.println("A: вызываем метод f()");
    }
    void g() {
        System.out.println("A: вызываем метод g()"); 
    }
}

 
Код

class C {
    // Создаём объект методы которого будем делегировать
    A a = new A();
 
    void f() {
        a.f();
    }
    void g() {
        a.g();
    }
 
    // normal attributes
    X x = new X();
    void y() {
        /* do stuff */
    }
}

 
Код

public class Main {
    public static void main(String[] args) {
        C c = new C();
        c.f();
        c.g();
    }
}

Данный подход позволят создать новый класс на основе готовых объектов с дальнейшим вызовом их методов


1)  Композиция || Агрегирование || Агрегация: 
Включение в тело класса тела сторонних классов, подразумевают методику создания нового класса из уже существующих классов

Код

class A {
    void f() {
        System.out.println("A: вызываем метод f()");
    }
    void g() {
        System.out.println("A: вызываем метод g()"); 
    }
}


Код

class C {
    //Агрегируем класс С в класс A
 
    void f() {
    }
    void g() {
    }
 
    // normal attributes
    X x = new X();
    void y() {
        /* do stuff */
    }
}


если в результате будут использованы методы из классов зачем это разделение на Композицию и Делегирование?
только ради того дабы получить доступ к методам сторонних классов в теле базового класса не создавая при этом объект?


Это сообщение отредактировал(а) powerOn - 13.10.2009, 23:21
PM MAIL   Вверх
Старовъръ
Дата 13.10.2009, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: 4
Всего: 10



Лень было все читать, просто напишу:
Делегирование - передача обязанностей другому объекту.
Ассоциация - обычное владение объектом.
Агрегация - владелец состоит из объектов, которые есть неотъемлемой его частью.
Композиция - владелец состоит из объектов, которые есть неотъемлемой его частью, и эти объекты не могут жить вне владельца.
PM MAIL WWW   Вверх
revenforv
Дата 14.10.2009, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 6.8.2009
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(Старовъръ @  13.10.2009,  23:06 Найти цитируемый пост)
Агрегация - владелец состоит из объектов, которые есть неотъемлемой его частью.
Композиция - владелец состоит из объектов, которые есть неотъемлемой его частью, и эти объекты не могут жить вне владельца. 

Можете меня пнуть, но насколько помню агрегация и композиция это одно и тоже, просто второе ближе к проектированию, а первое к отношениям между объектами.


Цитата(initmax @  13.10.2009,  22:52 Найти цитируемый пост)
если в результате будут использованы методы из классов зачем это разделение на Композицию и Делегирование?
только ради того дабы получить доступ к методам сторонних классов в теле базового класса не создавая при этом объект?

Обычно агрегация подразумевает делегирование в той или иной форме. Можно например писать обертки и враперы таким образом, делегируя операции внутренним классам. Насколько помню, патерны bridge и adapter работают по этому принципу. А composite работает по принципу композиции (здесь в идет делегирование в неявной форме). Есть еще external iterator (или internal - поправьте меня), он делегирует выполнение операции каждому элементу который обходит.

PM MAIL Skype   Вверх
Старовъръ
Дата 14.10.2009, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: 4
Всего: 10



Цитата
Можете меня пнуть, но насколько помню агрегация и композиция это одно и тоже, просто второе ближе к проектированию, а первое к отношениям между объектами.
Нет, просто разница между ними очень тонкая. 
Можно сказать так:
 агрегация - это разновидность ассоциации, когда один объект состоит из других.
 композиция - это разновидность агрегации, когда объект-владелец контролирует еще и жизненный цикл других объектов(т.е. они умирают вместе с ним, они не существуют вне его).
В UML ассоциация обозначается обычной стрелочкой(некоторые обозначают без наконечника), агрегация - стрелочкой с ромбиком, композиция - стрелочкой с закрашенным ромбиком.

Это сообщение отредактировал(а) Старовъръ - 14.10.2009, 08:07
PM MAIL WWW   Вверх
Andy_L20066
Дата 21.10.2009, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 10.3.2008

Репутация: нет
Всего: 1



привет, интересный вопрос... я когда-то читал нечто подобное... 
вот что думаю по этому поводу:
делегирование это нечто более "сложное" чем композиция, вот пример простой композиции: 
Код

class A{

List<String> list = new ArrayList<String>();

public void doSomethingtoA(){
 list.add("Hello");
}

}

здесь идет просто передача управления листу который фактически входит в состав обьекта A. 
Но это не совсем делегация, так как делегация предусматривает передачу обьекта (обьект1 передает получает риквест, и потом просто передает себя и риквест делегату(обьекту2). Ярким примером делегации является паттерн State, когда робота происходит в контексте, который делегирует себя конкретному обьекту (стейту), который изменяет контекст... вот здесь почитай про State:  http://java-x.blogspot.com/2006/12/impleme...rn-in-java.html


PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0733 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.