Dwie podobne klasy a wzorce projektowe

0

Hej!
Mam klasę powiedzmy:

public class A {

  public void firstMethod() {
    /...
  }
  
  public int secondMethod() {
    /...
  }
}

Chcę dodać identyczną klasę (jeśli chodzi o to, co w metodach) ale z odpowiednimi adnotacjami, czyli:

@Secured
public class B {
  
  @Secured
  public void firstMethod() {
    /...
  }
  
  @Secured
  public int secondMethod() {
    /...
  }
}

Jakimi wzorcami projektowymi się posługiwać, żeby nie zduplikować kodu i wszystko działało jak należy?

2

To na jakis dekorator/proxy wyglada

4

A muszą być te adnotacje? Jeśli nie to możesz wykorzystać dziedziczenie albo kompozycję.

Przykład z dziedziczeniem:

abstract class Service {
  protected abstract void securityCheck()

  public int firstMethod() {
    securityCheck();
    // implementacja
  }

  public int secondMethod() {
    securityCheck();
    // implementacja
  }
}

class SecuredService {
  // nadpisuje securityCheck i w środku sprawdza zabezpieczenia
}

class UnsecuredService {
  // nadpisuje securityCheck i w środku nic nie robi
}

Przykład z kompozycją:

class SecurityChecker {
  public void securityCheck() {
    // implementacja
  }
}

class Service {
  private final SecurityChecker securityChecker = ??? ;

  public int firstMethod() {
    securityChecker.check();
    // implementacja
  }

  public int secondMethod() {
    securityChecker.check();
    // implementacja
  }
  
}

Powyższy sposób jest jednak taki mocno imperatywny. Zamiast mieć wszędzie voidy mógłbyś postawiać jakieś lambdy, dodatkowe typy opakowujące wynik (SecurityChecked<T>?), itd Możliwe też, że zabezpieczenia masz w złym miejscu, np uruchamiasz je później niż mógłbyś.

1

Żaden. Klasa B to wrapper klasy A.

0

To teraz pytanie ode mnie

Jak mamy cos takiego

interface Foo {
    void firstMethod();
    void secondMethod();
}
class A implements Foo (...)


class SecuredA implements Foo {
    private A a;
    SecuredA(A a) {
        this.a = a;
    }
    @Secured
    void firstMethod() {
        a.firstMethod();
    }
    @Secured
    void secondMethod() {
        a.secondMethod();
    }
}

To te annotacje to dzialaja?
W Kotlinie sie tego dziadostwa nie uzywa na szczescie :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1