Декоратор, адаптер или что то еще

Для уменьшения связности кода хочу что бы классы максимально сосредотачивались только на своих задачах и не имели понятия о потребностях кода, который их использует. Но коду который их использует необходимы некие дополнительные возможности. Поэтому необходимо реализовать нечто, что расширяло бы возможности класса. Однако я запутался какой паттерн здесь применим.

Т.е. я хочу иметь некий класс C2. Этот класс может возвращать объекты С1. С1 и С2 являются частью некого пакета, который живет самостоятельной жизнью и не занает, как его используют другие. Класс С3 использует С2. С2 в С3 возвращает объект класса С1. Но С3 хочет расширенные возможности класса С1, такие какие есть у С4. Поэтому создается новый объект С4, который принимает на вход конструктора объект класса С1.

введите сюда описание изображения

Как я понимаю:

  • Паттерн "декоратор" предназначен для расширения возможностей уже существующих функций, а я хочу ввести новые.
  • Паттерн "адаптер" предполагает реализацию методов путем вызова кода из уже существующих классов. Т.е. некое "переименование" методов (трансформация интерфейса), а я хочу оставить уже существующие методы без изменений, и только расширить функционал.

Есть ли какой то паттерн, который подходит для данной задачи? Или есть ли какой то способ решить задачу иным образом, сохранив независимость работы С1 и С2, и обеспечив С3 возможностью использовать более расширенный функционал С1?


Ответы (2 шт):

Автор решения: denis Krivorutchko

Вам нужно два интейфейса, первый будет работать как АДАПТЕР и будет в себе содержать, интерфейс который будет работать как АПДЕЙТЕР и будет нести в себе новую функциональность, и если вам нужна новая функциональность, вам нужно будет делегировать работу вложеному интейсу с определеным АПДЕЙТЕРОМ

Например у вас есть интерфейс А который будет нести в себе какойто функционал, и содержать в себе интейфейс В, интерфейс В ето и будешь ваш АПДЕЙТЕР в который будет нести в себе один метод -NewMethot(), который вы будете вызывать

→ Ссылка
Автор решения: denis Krivorutchko
    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();
    }
}
→ Ссылка