interface Analyzer {
int computeValue();
}
class AnalyzerImpl implements Analyzer {
@Override
public int computeValue() {
return 5;
}
@Override
public String performAnalysis
() { return "Result: " + computeValue();
}
}
class AnalyzerDecorator implements Analyzer {
Analyzer delegate;
public AnalyzerDecorator(Analyzer delegate) {
this.delegate = delegate;
}
@Override
public int computeValue() {
return delegate.computeValue();
}
@Override
public String performAnalysis
() { return delegate.performAnalysis();
}
}
class Main {
// Tweak an analyzer to return 1337.
public static Analyzer tweakAnalyzer(Analyzer untweakedAnalyzer) {
return new AnalyzerDecorator(untweakedAnalyzer) {
@Override
public int computeValue() {
return 1337; // tweaked value!
}
};
}
// Test the analyzer tweaking.
public static void main
(String[] args
) { System.
out.
println(tweakAnalyzer
(new AnalyzerImpl
()).
performAnalysis()); }
}
aW50ZXJmYWNlIEFuYWx5emVyIHsKICAgIGludCBjb21wdXRlVmFsdWUoKTsKICAgIFN0cmluZyBwZXJmb3JtQW5hbHlzaXMoKTsKfQoKCmNsYXNzIEFuYWx5emVySW1wbCBpbXBsZW1lbnRzIEFuYWx5emVyIHsKCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBpbnQgY29tcHV0ZVZhbHVlKCkgewogICAgICAgIHJldHVybiA1OwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIFN0cmluZyBwZXJmb3JtQW5hbHlzaXMoKSB7CiAgICAgICAgcmV0dXJuICJSZXN1bHQ6ICIgKyBjb21wdXRlVmFsdWUoKTsKICAgIH0KfQoKCmNsYXNzIEFuYWx5emVyRGVjb3JhdG9yIGltcGxlbWVudHMgQW5hbHl6ZXIgewogICAgQW5hbHl6ZXIgZGVsZWdhdGU7CiAgICBwdWJsaWMgQW5hbHl6ZXJEZWNvcmF0b3IoQW5hbHl6ZXIgZGVsZWdhdGUpIHsKICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgaW50IGNvbXB1dGVWYWx1ZSgpIHsKICAgICAgICByZXR1cm4gZGVsZWdhdGUuY29tcHV0ZVZhbHVlKCk7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgU3RyaW5nIHBlcmZvcm1BbmFseXNpcygpIHsKICAgICAgICByZXR1cm4gZGVsZWdhdGUucGVyZm9ybUFuYWx5c2lzKCk7CiAgICB9Cn0KCgpjbGFzcyBNYWluIHsKICAgIAogICAgLy8gVHdlYWsgYW4gYW5hbHl6ZXIgdG8gcmV0dXJuIDEzMzcuCiAgICBwdWJsaWMgc3RhdGljIEFuYWx5emVyIHR3ZWFrQW5hbHl6ZXIoQW5hbHl6ZXIgdW50d2Vha2VkQW5hbHl6ZXIpIHsKICAgICAgICByZXR1cm4gbmV3IEFuYWx5emVyRGVjb3JhdG9yKHVudHdlYWtlZEFuYWx5emVyKSB7CiAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICBwdWJsaWMgaW50IGNvbXB1dGVWYWx1ZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxMzM3OyAgICAgICAgICAgICAgLy8gdHdlYWtlZCB2YWx1ZSEKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICAKICAgIC8vIFRlc3QgdGhlIGFuYWx5emVyIHR3ZWFraW5nLgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0d2Vha0FuYWx5emVyKG5ldyBBbmFseXplckltcGwoKSkucGVyZm9ybUFuYWx5c2lzKCkpOwogICAgfQp9Cg==