2

デコレータ パターンを検討していたことが何度かありましたが、クラスのメソッドをラップしてデコレートしているクラスに機能を渡すのは非常に面倒なので、そうしないように誘惑されました。書き込み:

 public int methodA(int argument){
     return decoratee.methodA(argument);
 }

そのうちの 1 つまたは 2 つだけを変更することに本当に関心がある場合、多数のメソッドを何度も何度も変更するのは面倒です。さらに、新しいメソッドをクラス/インターフェイスに追加する場合、デコレーター パターンを使用しているすべてのクラスに戻り、そのメソッドをすべての人に公開することを忘れないでください。

これを行うためのより簡単な方法があるはずです。つまり、理論的には、クラスの拡張を処理するのとほぼ同じようにデコレータ パターンを処理する言語機能を実装できるということです。スーパーへの呼び出しを行う代わりに、装飾されたクラスへの呼び出しを行います。装飾されたクラスのメソッドが呼び出され、デコレーターに何も記述されていない場合、その呼び出しは装飾されたクラスに自動的に渡されます。装飾クラスがメソッドを非表示にしたい場合、装飾クラスが別のロジックを実装したい場合にのみ、完全なメソッドを実際に書き出す必要があります。おそらく、装飾されたクラスのどのメソッドを使用可能にする必要があり、どのメソッドを使用可能にしないかをすばやく識別できるようにするための優れた注釈が付けられます

私のためにこの種のロジックを実行するものありますか? つまり、上記で説明したように Java laungae 自体に組み込まれているとは思えません。それでも、少なくともEclipseはこのようなメソッドの自動ラッピングを処理しますか?

4

1 に答える 1

0

まあ、ちょっと。オブジェクト指向の世界を十分に活用していないと思います。抽象クラスを使用すると、退屈なラップをすべてラップするなど、デフォルトのデコレータの動作を実装できます。次に、この 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;
    }
}
于 2013-05-23T22:11:21.043 に答える