Здесь вы пытаетесь сделать перехватывать поведение, более или менее приватное в отношениях между типом BaseImplementation
и одним из его производных типов & ndash; здесь, ваш экземпляр "делегата", который вы ' Я хотел бы украсить в вашем ImplementationDecorator
классе. Автор BaseImplementation
никогда не ожидал, что кто-то захочет попасть туда посередине, а автор типа, производного от BaseImplementation
, не ожидал, что туда войдут другие абоненты, кроме BaseImplementation
.
Вместо этого, шаблон, который вы ищете, будет выглядеть примерно так, что, боюсь, вы не сможете модернизировать, если не владеете участвующими классами:
public interface URLProvider
{
String getBase();
}
public final class BaseImplementation
{
public BaseImplementation(URLProvider provider)
{
if (null == provider)
throw new NullPointerException();
this.provider = provider;
}
public String getResource1()
{
return processTemplate1(provider.getBase());
}
public String getResource2()
{
return processTemplate2(provider.getBase());
}
private final URLProvider provider;
}
Имея это в виду, если бы кто-то написал реализацию типа URLProvider
, его было бы легко декорировать, потому что теперь метод URLProvider#getBase()
является общедоступным.
Теперь вы можете сказать, ну, разве это не то же самое, что просто поменять ваш BaseImplementation#getBaseUrl()
метод на публичный, а не защищенный? Не совсем. Здесь проект подтверждает & mdash; или даже предупреждает & mdash; экземпляр URLProvider
- это возможность, которую можно использовать из любого места.