Ваш первый пример - это не композиция.
Composition является «has-a» отношения между 2 объектами, где один объект (состоит объект) является членом поле другого (владелец).
Состав будет:
class DemoA {
DemoB b; //composition
}
Мы бы сказали, "DemoA состоит из дембеля".
Если DemoB
объект еще можно использовать, когда DemoA
становится недостижимым, мы считаем DemoB
быть aggregated. Например, ключи все еще могут использоваться, хотя брелоки могут быть уничтожены. Брелок будет состоять из ключей, но не принадлежит им, что выражает агрегацию.
Ваш пример переадресации выглядит хорошо, хотя требования действительно говорят «возвращать результаты», которые могут предложить методы не должны быть недействительными:
class DemoA {
private DemoB b;
public int doSomething() {
return b.doSomething(); //forwarding/delegating
}
}
Что касается оберток , они инкапсулируют поведение объекта, подвергая новое (и обычно более сложное) поведение. Примером может служить DataInputStream
, который обертывает InputStream
, чтобы вы могли читать объекты String
и более, когда InputStream
способен только на примитивные данные.
class DemoB {
public int read() {
//...Read one int of data
}
}
class DemoA {
private DemoB b;
public DemoA(DemoB b) {
this.b = b;
}
public List<Integer> readUntil(List<Integer> dataList, Supplier<Boolean> condition) {
while(condition.get())
dataList.add(b.read());
return dataList;
}
}
В этом примере DemoA
обручи DemoB
подвергать readUntil
поведение, что-то DemoB
был не в состоянии сделать.
Это несколько глупый пример, но, надеюсь, выражает точку: Наш DemoB
объект не может выполнить поведение, что нам нужно (readUntil), поэтому мы обернуть его в тип, который обрабатывает поведение для нас, так что мы Арен» постоянно переписывая такое поведение.