WindowItem 클래스에 Java 클래스가 있습니다.이 메소드 중 하나는 스레드로부터 안전하지 않습니다. WindowItem은 외부 프레임 워크의 일부이기 때문에 수정할 수 없습니다. 그래서 나는 그것에 대한 Decorator를 구현하는 것을 알았다. 그것은 문제의 메서드에 "동기화 된"키워드를 가지고있다.최종 메소드가있는 Java 용 Decorator
Decorator는 WindowItem을 확장하며 WindowItem도 포함합니다. 데코레이터 패턴 다음에는 데코레이터에 포함 된 WindowItem을 호출하는 데코레이터에 메서드를 만듭니다.
그러나 WindowItem에는 데코레이터에서 재정의 할 수없는 몇 가지 최종 방법이 있습니다. 이로 인해 Decorator의 투명성이 손상됩니다. 의이 명시 만들어 보자 : 새로운 WindowItemDecorator (아이템) -와 스레드 안전 문제가 사라 : 내 자신의 코드에서
public class WindowItem {
private List<WindowItem> windows;
public Properties getMethodWithProblem() {
...
}
public final int getwindowCount() {
return windows.size();
}
}
public class WindowItemDecorator extends WindowItem {
private WindowItem item;
public WindowItemDecorator(WindowItem item) {
this.item = item;
}
# Here I solve the problem by adding the synchronized keyword:
public synchronized Properties getgetMethodWithProblem() {
return super.getMethodWithProblem();
}
# Here I should override getWindowCount() but I can't because it's final
}
를, 내가 어딘가 WindowItem을 통과해야 할 때마다, 내가 먼저 장식에 싸서. 그러나 내 코드가 WindowItemDecorator에서 getwindowCount()를 호출하면 항상 0이됩니다. "item"멤버 대신 슈퍼 클래스에서 getWindowCount()를 실행합니다.
그래서 나는이 클래스에 대한 장식자를 만드는 것이 불가능하게 만드는 WindowItem (public final 메서드가 있다는 사실)의 디자인을 말합니다.
맞습니까? 아니면 뭔가 빠졌습니까?
이 경우 데코레이터에 창의 목록 복사본을 유지하고 동기화 상태로 유지 한 다음 getWindowCount() 결과가 정확할 수 있습니다. 그러나이 경우 프레임 워크를 포크하고 패치하는 것을 선호합니다 ...
첫 번째 반사가 적합하지만 최종 방법을 사용하면 반사를 무시할 수 없습니다. "WindowItem"유형의 객체를 전달/조작해야합니까? 그렇지 않은 경우 Decorator 패턴을 사용할 필요가 없습니다. 컴포지션을 사용하고 WindowItem의 마지막 메서드에 대한 호출을 제어 할 수 있습니다.이 클래스는 WindowItem을 확장하지 않지만 컴포지션을 통해 인스턴스를 사용하는 새 클래스에 래핑하여 호출 할 수 있습니다. – Ushox