interface Analyzer {
String performAnalysis
(Calculator calculator
); }
interface Calculator {
int computeValue();
}
class CalculatorImpl implements Calculator {
@Override
public int computeValue() {
return 5;
}
}
class AnalyzerImpl implements Analyzer {
@Override
public String performAnalysis
(Calculator calculator
) { return "Result: " + calculator.computeValue();
}
}
class CalculatorDecorator implements Calculator {
Calculator delegate;
public CalculatorDecorator(Calculator delegate) {
this.delegate = delegate;
}
@Override
public int computeValue() {
return delegate.computeValue();
}
}
class Main {
// Tweak a calculator to return 1337.
public static Calculator tweakCalculator(Calculator untweakedCalculator) {
return new CalculatorDecorator(untweakedCalculator) {
@Override
public int computeValue() {
return 1337; // tweaked value!
}
};
}
// Test the analyzer tweaking.
public static void main
(String[] args
) { System.
out.
println(new AnalyzerImpl
().
performAnalysis(tweakCalculator
(new CalculatorImpl
()))); }
}
aW50ZXJmYWNlIEFuYWx5emVyIHsKICAgIFN0cmluZyBwZXJmb3JtQW5hbHlzaXMoQ2FsY3VsYXRvciBjYWxjdWxhdG9yKTsKfQoKaW50ZXJmYWNlIENhbGN1bGF0b3IgewogICAgaW50IGNvbXB1dGVWYWx1ZSgpOwp9CgpjbGFzcyBDYWxjdWxhdG9ySW1wbCBpbXBsZW1lbnRzIENhbGN1bGF0b3IgewogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgaW50IGNvbXB1dGVWYWx1ZSgpIHsKICAgICAgICByZXR1cm4gNTsKICAgIH0KfQoKY2xhc3MgQW5hbHl6ZXJJbXBsIGltcGxlbWVudHMgQW5hbHl6ZXIgewogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgU3RyaW5nIHBlcmZvcm1BbmFseXNpcyhDYWxjdWxhdG9yIGNhbGN1bGF0b3IpIHsKICAgICAgICByZXR1cm4gIlJlc3VsdDogIiArIGNhbGN1bGF0b3IuY29tcHV0ZVZhbHVlKCk7CiAgICB9Cn0KCmNsYXNzIENhbGN1bGF0b3JEZWNvcmF0b3IgaW1wbGVtZW50cyBDYWxjdWxhdG9yIHsKICAgIENhbGN1bGF0b3IgZGVsZWdhdGU7CiAgICBwdWJsaWMgQ2FsY3VsYXRvckRlY29yYXRvcihDYWxjdWxhdG9yIGRlbGVnYXRlKSB7CiAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIGludCBjb21wdXRlVmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmNvbXB1dGVWYWx1ZSgpOwogICAgfQp9CgoKY2xhc3MgTWFpbiB7CiAgICAKICAgIC8vIFR3ZWFrIGEgY2FsY3VsYXRvciB0byByZXR1cm4gMTMzNy4KICAgIHB1YmxpYyBzdGF0aWMgQ2FsY3VsYXRvciB0d2Vha0NhbGN1bGF0b3IoQ2FsY3VsYXRvciB1bnR3ZWFrZWRDYWxjdWxhdG9yKSB7CiAgICAgICAgcmV0dXJuIG5ldyBDYWxjdWxhdG9yRGVjb3JhdG9yKHVudHdlYWtlZENhbGN1bGF0b3IpIHsKICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcHV0ZVZhbHVlKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDEzMzc7ICAgICAgICAgICAgICAvLyB0d2Vha2VkIHZhbHVlIQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIAogICAgLy8gVGVzdCB0aGUgYW5hbHl6ZXIgdHdlYWtpbmcuCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBBbmFseXplckltcGwoKS5wZXJmb3JtQW5hbHlzaXModHdlYWtDYWxjdWxhdG9yKG5ldyBDYWxjdWxhdG9ySW1wbCgpKSkpOwogICAgfQp9Cg==