う〜ん、アノテーション使ったこういう委譲の方法が、無いわけでもない。

public interface Thin {
 String a();
 String b();
}

public class ThinImpl1 implements Thin {
 public String a() {return "a";}
 public String b() {return "b";}
}

public class ThinImpl1 implements Thin {
 public String a() {return "A";}
 public String b() {return "B";}
}

import lombok.Delegate;
public class Fat implements Thin{

 @Delegate private Thin thin;

 public Fat(Thin thin) {super(); this.thin = thin;}
 public String c(){ return this.a() + this.b() + "c";}
}

new Fat(new ThinImpl1()).c(); // <- "abc"
new Fat(new ThinImpl2()).c(); // <- "ABc"

表向きの見た目としてはそれなりにシンプルだと思うのだけれども、どうだろう。
(裏で何が起こっているかは突っ込んではいけない)。