まあ、ちょっと。オブジェクト指向の世界を十分に活用していないと思います。抽象クラスを使用すると、退屈なラップをすべてラップするなど、デフォルトのデコレータの動作を実装できます。次に、この Decorator 抽象クラスを拡張して、オーバーライドするものを選択するだけです!
このようなもの:
Decoratee.java
public interface Decoratee {
public int methodA(int argument);
public int methodB(int argument);
}
DecorateeA.java
public class DecorateeA implements Decoratee {
private final Object arg1, arg2;
public Decoratee(Object arg1, Object arg2){
this.arg1 = arg1;
this.arg2 = arg2;
}
public int methodA(int argument){
return someInt;
}
public int methodB(int argument){
return someInt;
}
}
Decorator.java
public abstract class Decorator implements Decoratee {
private final Decoratee decoratee;
public Decorator(Decoratee decoratee){
this.decoratee = decoratee;
}
public int methodA(int argument){
return decoratee.methodA(argument);
}
public int methodB(int argument){
return decoratee.methodB(argument);;
}
}
DecoratorA.java
public class DecoratorA extends Decorator {
public DecoratorA(Decoratee decoratee){
super(decoratee);
}
public int methodA(int argument){
return someOhterInt;
}
//methodB inherited from Decorator
}
DecoratorB.java
public class DecoratorB extends Decorator {
public DecoratorB(Decoratee decoratee){
super(decoratee);
}
//methodA inherited from Decorator
public int methodB(int argument){
return someOhterInt;
}
}
はい、まだこれらのものをラップする必要があります。ここでの利点は、それらを1 回だけラップする必要があることです。その後、顔が青くなるまでデコレータを作成できます。
さらに、被装飾者のメソッドにアクセスする必要がある場合は、super
キーワードを介して呼び出すことができます。
public class DecoratorC extends Decorator {
public DecoratorC(Decoratee decoratee){
super(decoratee);
}
//methodA inherited from Decorator
public int methodB(int argument){
return someOhterInt + super.methodB(argument);
//super.methodB calls Decorator.methodB which calls decoratee.methodB;
}
}