さて、私は1つのグラフィックオブジェクトがグループと長方形で拡張される合成パターンを使用しています。グループには多くの長方形を含めることができ、paint()メソッドはグループを呼び出し、長方形でpaintメソッドを呼び出し、各長方形はそれ自体を描画します。
次に、長方形を左側または右側に揃えるために、その上でデコレータパターンを使用する必要があります。ここで、グループでデコレータを使用すると、グループの座標が整列するだけですが、すべての長方形がそれ自体を描画するため、それらには影響しません。
では、ここでデコレータパターンをどのように使用できるかについてのアイデアはありますか?
つまり、これを使用することを考えることができる唯一の方法は、整列する必要があるグループ内のすべての長方形とすべての要素の周りにデコレータラッパーを使用することです。しかし、これはデコレータパターンのポリシーに反しませんか?つまり、グループはリストに何が含まれているかを技術的に知りません。つまり、要素は単なるGraphicObjectインスタンスであり、長方形は、長方形のペイントを呼び出す前に座標を変更するデコレータでラップされていることを知りません。 )メソッド。
それが唯一の方法である場合、それらのアイテムを装飾するためにどのように使用しますか?ここでリフレクションを使用する必要がありますか、それとも他の/より正しい方法がありますか?
いくつかのコード:
if (mainGroup == null) {
mainGroup = new Group();
// first line
currentBounds = convertToBoundsForLine(x, y, width, lineHeight, 1);
//System.out.format("current bounds: x1=%d, y1=%d, x2=%d, y2=%d%n", currentBounds.getX(), currentBounds.getY(), currentBounds.getX2(), currentBounds.getY2());
GraphicObject rect1 = new Rectangle(currentBounds);
mainGroup.addChild(rect1);
// other lines...
// fifth line
currentBounds = convertToBoundsForLine(x, y, width, lineHeight, 5);
//System.out.format("current bounds: x1=%d, y1=%d, x2=%d, y2=%d%n", currentBounds.getX1(), currentBounds.getY1(), currentBounds.getX2(), currentBounds.getY2());
GraphicObject rect5 = new Rectangle(currentBounds);
// this is with the decorator wrapper around - should I use reflection here?
GraphicObject blabla = new DecoratorLeft(rect5);
mainGroup.addChild(blabla);
5行目で、グループに追加する前にデコレータ内のどこに長方形を配置しているかがわかります。したがって、反射を使用して、グループに追加されるすべての長方形でそれらを使用する必要があります。それともそれを行うためのより良い方法はありますか?
それとも、ここでのデコレータの使用方法は一般的にまったく間違っていますか?
前もって感謝します。
編集:
グループでのペイントメソッドの実装方法は次のとおりです。
public void draw(Graphics g, AlignStrategy align) {
for (GraphicObject graphic: children) {
graphic.draw(g, align);
}
}
このグループは、子の描画メソッドを呼び出すだけです。
問題は、デコレータは私の意見ではユニバーサルでなければならないということです。あなたが与えた提案によると、それは依存するように思われますか?つまり、グループは基本的に配置に依存していますか?オブジェクトを回転させたり、座標xをyに切り替えたりするデコレータを作成したとしたらどうでしょうか。つまり、左、右、または中央に位置合わせすることではなく、コードをデコレータにあまり適合させなくてもデコレータが機能することです。