Как при ассоциации, так и при агрегировании один класс поддерживает ссылку на другой класс.
Тогда подразумевает ли внедрение конструктора композицию? Следуя той же логике, можно ли с уверенностью сказать, что внедрение сеттера приводит к ассоциации, а не к агрегации?
2 ответа
Агрегация - это просто еще одно представление ассоциации. Таким образом, внедрение установщика приводит к ассоциации и агрегации - как и внедрение конструктора.
Спорный вопрос о том, подразумевает ли внедрение конструктора композицию, поскольку, согласно строгой интерпретации композиции, сам класс должен нести ответственность как за создание, так и за разрушение составного класса.
На уровне кода Java, если у вас есть класс 2 и класс 3, это ожидаемый код.
Традиционная связь от 0..1 до 0..1 дает следующий код:
public class Class2 {
private Class3 class3;
public Class3 getClass3() {
return class3;
}
public void setClass3(Class3 class3) {
this.class3 = class3;
}
}
Класс 3 - это тот же код, что и класс 2.
Обратите внимание, что ассоциации связаны с атрибутами, а не с методами, поэтому, если мы решим не использовать аксессоры, тогда код будет только таким:
public class **Class2** {
private Class3 class3;
Агрегация от 1 до многих дает следующий код:
import java.util.Collection;
import java.util.Iterator;
public class Class2 {
private Collection<Class3> class3 = null;
public Collection<Class3> getClass3() {
return class3;
}
public Iterator<Class3> class3Iterator() {
return class3.iterator();
}
public boolean isClass3Empty() {
return class3.isEmpty();
}
public boolean containsClass3(Class3 class3) {
return this.class3.contains(class3);
}
public boolean containsAllClass3(Collection<Class3> class3) {
return this.class3.containsAll(class3);
}
public int class3Size() {
return class3.size();
}
public Class3[] class3ToArray() {
return class3.toArray(new Class3[class3.size()]);
}
public void setClass3(Collection<Class3> class3) {
this.class3 = class3;
}
public boolean addClass3(Class3 class3) {
return this.class3.add(class3);
}
public boolean removeClass3(Class3 class3) {
return this.class3.remove(class3);
}
public void clearClass3() {
this.class3.clear();
}
}
public class Class3 {
private Class2 class2 = null;
public Class2 getClass2() {
return class2;
}
public void setClass2(Class2 class2) {
this.class2 = class2;
}
}
Надеюсь это поможет
Похожие вопросы
Новые вопросы
dependency-injection
Шаблон проектирования для уменьшения связи между компонентами путем динамического внедрения в зависимости компонента программного обеспечения, которые ему необходимы для функционирования.