Декоратор, адаптер или что то еще
Для уменьшения связности кода хочу что бы классы максимально сосредотачивались только на своих задачах и не имели понятия о потребностях кода, который их использует. Но коду который их использует необходимы некие дополнительные возможности. Поэтому необходимо реализовать нечто, что расширяло бы возможности класса. Однако я запутался какой паттерн здесь применим.
Т.е. я хочу иметь некий класс C2. Этот класс может возвращать объекты С1. С1 и С2 являются частью некого пакета, который живет самостоятельной жизнью и не занает, как его используют другие. Класс С3 использует С2. С2 в С3 возвращает объект класса С1. Но С3 хочет расширенные возможности класса С1, такие какие есть у С4. Поэтому создается новый объект С4, который принимает на вход конструктора объект класса С1.
Как я понимаю:
- Паттерн "декоратор" предназначен для расширения возможностей уже существующих функций, а я хочу ввести новые.
- Паттерн "адаптер" предполагает реализацию методов путем вызова кода из уже существующих классов. Т.е. некое "переименование" методов (трансформация интерфейса), а я хочу оставить уже существующие методы без изменений, и только расширить функционал.
Есть ли какой то паттерн, который подходит для данной задачи? Или есть ли какой то способ решить задачу иным образом, сохранив независимость работы С1 и С2, и обеспечив С3 возможностью использовать более расширенный функционал С1?
Ответы (2 шт):
Вам нужно два интейфейса, первый будет работать как АДАПТЕР и будет в себе содержать, интерфейс который будет работать как АПДЕЙТЕР и будет нести в себе новую функциональность, и если вам нужна новая функциональность, вам нужно будет делегировать работу вложеному интейсу с определеным АПДЕЙТЕРОМ
Например у вас есть интерфейс А который будет нести в себе какойто функционал, и содержать в себе интейфейс В, интерфейс В ето и будешь ваш АПДЕЙТЕР в который будет нести в себе один метод -NewMethot(), который вы будете вызывать
public interface A {
void DoSome();
void DoSome2();
}
public class Aimpl implements A {
public C c;
public Aimpl(C c) {
this.c = c;
}
public Aimpl() {
}
@Override
public void DoSome() {
System.out.println("DoSome in A");
}
@Override
public void DoSome2() {
System.out.println("DoSome2 in A");
}
}
Цитата
public interface B {
boolean newMethod();
}
Цитата
public interface C extends A,B {
}
public class Cimpl implements C {
@Override
public void DoSome() {
}
@Override
public void DoSome2() {
}
@Override
public void newMethod() {
System.out.println("newMethod");
}
}
Main
public class Main {
public static void main(String[] args) {
Cimpl cimpl = new Cimpl();
Aimpl aimpl = new Aimpl(cimpl);
aimpl.c.newMethod();
}
}
