디자인 패턴이 포함된 실용적인 Java15 밀폐형 인터페이스

template methodchain of responsibility 패턴을 빠르게 검토하기 위해 추상 클래스를 사용하여 체인의 템플릿을 정의할 수 있습니다.

abstract class MiddlewareBase {
    static MiddlewareBase of(MiddlewareBase... middlewares) {
        for (int i = 0; i < middlewares.length - 1; i++) {
            middlewares[i].setNext(middlewares[i + 1]);
        }
        return middlewares[0];
    }
    private MiddlewareBase next;
    public void setNext(MiddlewareBase next) {
        this.next = next;
    }
    public final void check(Request request) {
        checkInternal(request);
        if (next != null) {
            next.checkInternal(request);
        }
    }
    abstract void checkInternal(Request request);
}


지금까지 이것은 훌륭하고 완벽해 보입니다. 이제 더 많은 추상화를 추가하고 단순한 구현이 아닌 인터페이스를 구현하는 프로그램을 달성하기 위해 인터페이스 관점에서 체인을 나타내는 미들웨어 인터페이스를 정의하겠습니다.

interface Middleware {
    void check(Request request);
}


그런 다음 MiddlewareBase를 다음과 같이 다시 작성할 수 있습니다.

abstract class MiddlewareBase implements Middleware {
    static Middleware of(MiddlewareBase... middlewares) {
        for (int i = 0; i < middlewares.length - 1; i++) {
            middlewares[i].setNext(middlewares[i + 1]);
        }
        return middlewares[0];
    }
    private MiddlewareBase next;
    public void setNext(MiddlewareBase next) {
        this.next = next;
    }
    public final void check(Request request) {
        checkInternal(request);
        if (next != null) {
            next.checkInternal(request);
        }
    }
    abstract void checkInternal(Request request);
}


이것과 미들웨어의 다음 두 가지 간단한 예

class CsrfMiddleware extends MiddlewareBase {
    @Override
    void checkInternal(Request request) {
        System.out.println("csrf check");
    }
}
class XssMiddleware extends MiddlewareBase {
    @Override
    void checkInternal(Request request) {
        System.out.println("xss check");
    }
}


다음과 같이 미들웨어 체인을 정의하고 사용할 수 있습니다.

Middleware middleware = MiddlewareBase.of(new CsrfMiddleware(), 
                                        new XssMiddleware());
middleware.check(new Request());


그러나 어떤 것도 다른 사람이 미들웨어 인터페이스를 구현하는 것을 방해하고 체인 구현을 끊을 수 없습니다.
— — — — — —
버전 15부터 미리 보기 기능으로 JDK는 봉인된 클래스/인터페이스 기능을 제공하여 이를 확장하거나 구현할 수 있는 다른 클래스나 인터페이스를 제한했습니다.sealed 한정자를 사용하여 봉인된 인터페이스/클래스를 정의할 수 있습니다. 그런 다음 extendsimplements 절 다음에 permits 절이 봉인된 클래스를 확장할 수 있는 클래스를 지정합니다.

sealed interface Handler permits HandlerTemplate {
  void handle(Handleable handleable);
}


이 정의를 사용하면 HandlerTemplate를 제외한 어떤 클래스도 Handler 인터페이스를 구현할 수 없습니다.
이제 미들웨어 예제를 봉인된 인터페이스로 재정의하여 아무도 그것을 구현하고 CoR 구현으로서의 주요 목적을 깨뜨릴 수 없도록 합시다.

sealed interface Middleware permits MiddlewareBase {
    void check(Request request);
}


MiddlewareBase 클래스는 구현 클래스에 대한 제한이 없음을 의미하는 봉인되지 않은 한정자를 추가하는 것 외에는 변경 사항이 없습니다.

abstract non-sealed class MiddlewareBase implements Middleware {
...
}


또한 CsrfMiddlewareXssMiddleware는 변경되지 않습니다.
이제 우리가 Middleware의 또 다른 구현을 만들려고 시도하면 컴파일러는 class is not allowed to extend sealed class: Middleware를 불평하거나 intellij와 같은 IDE를 사용하여 직접 얻을 수 있습니다.


봉인된 클래스/인터페이스에는 많은 유용한 사용 사례가 있으며 Java에서 아직 미리 보기로 새롭다고 생각하면 의도가 다른 Kotlin(봉인된 클래스만) 및 Scala(봉인된 특성)과 같은 다른 언어로 제공됩니다.
언어 기능이 풍부할수록 더 나은 디자인을 얻을 수 있다는 사실을 표현하기 위해 핵심 디자인 원칙과 패턴으로 봉인된 인터페이스에 접근했습니다. 의견을 환영합니다.

좋은 웹페이지 즐겨찾기