Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Композиция vs Делегирование


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

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 */
    }
}


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

Автор: Старовъръ 13.10.2009, 22:06
Лень было все читать, просто напишу:
Делегирование - передача обязанностей другому объекту.
Ассоциация - обычное владение объектом.
Агрегация - владелец состоит из объектов, которые есть неотъемлемой его частью.
Композиция - владелец состоит из объектов, которые есть неотъемлемой его частью, и эти объекты не могут жить вне владельца.

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

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


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

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

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

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

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/implementing-state-pattern-in-java.html


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)