0

Canvas特定のdomainオブジェクトを異なる で表す必要があるの次の設計について質問がありますfigures

ドメイン オブジェクトとして機能する「エンクロージング」クラスが必要です。ユーザーに提示する必要があるデータを保持しますState。この State は変数として名前、もちろん状態などを持っています。

この状態は、 で視覚的に表す必要がありRectangleます。したがって、私は次を使用して考えましたComposition Pattern

interface Drawable {
 void draw();
}

class Rectangle implements Drawable {
    @Override
    void draw() {
        //draw the state as a rectangle depending on the state variables, draw the name etc.
    }
}

interface Figure {
    Drawable getDrawable();
}

class State implements Figure {
    boolean state;
    Rectangle rectangle;
    public Drawable getDrawable() { return rectangle; }
}

今、私はおそらく他のオブジェクトも持っており、それらも実装しているため、それらをペイントFigureするための固有のものを提供しています。Drawable

ここでの私の問題は次のとおりです。以下はdraw()すべてのオブジェクトに対して正しいメソッドを実行しますが、 draw メソッドはそれを囲むクラスのすべての情報を必要とします。

List<Figure> list;
for (Figure obj : list) {
    obj.getDrawable().draw();
}

メソッドは、たとえば、それを囲んでいるオブジェクトの名前変数などをどのようにdraw()知ることができますか?StateState

私が思いついた唯一のことは次のとおりです。

interface Drawable {
 void draw(Figure figure);
}

for (Drawable obj : list) {
    obj.getDrawable().draw(obj);
}

しかし、オブジェクトを呼び出し、同じステートメントでこのオブジェクトをパラメーターとして指定するのは正しくないと感じます!

どうすればこれをより良く行うことができますか?

4

2 に答える 2

1

ドメイン オブジェクトがそれを表すために使用される Drawable 実装を選択すると、Drawable への参照を提供できる論理的な場所が既に存在します。

 public class AStateObject {

      public Drawable getDrawable() {
           return new Rectangle(this);
      }

 }

したがって、各ドローアブルは、描画することになっている状態オブジェクトを認識しています。これにより、Drawable サブクラスごとに 1 つのインスタンスを使用することはできなくなりますが、このシナリオでは Drawable を安価に作成できます。

于 2013-03-28T15:52:58.240 に答える
0

ドローアブルをインスタンス化するときに、描画する必要がある属性を渡すことができます。たとえば、インターフェイスの代わりに抽象クラスを使用します。

public abstract class Drawable {

    private final Map<String, Object> attributes;

    public Drawable(final Map<String, Object> attributes) {
        this.attributes = attributes;
    }

    @SuppressWarnings("unchecked")
    public <T> T getAttribute(final String key) {
        return (T) attributes.get(key);
    }

    public abstract void draw();

}

public class Rectangle extends Drawable {

    public Rectangle(final Map<String, Object> attributes) {
        super(attributes);
    }

    @Override
    public void draw() {
        final String name = getAttribute("name");
        System.out.println(name);
    }

}

public interface Figure {

    public Drawable getDrawable();

}

public class State implements Figure {

    private final Rectangle rectangle;

    public State() {
        final Map<String, Object> attributes = new HashMap<String, Object>();
        attributes.put("name", "the rectangle");
        rectangle = new Rectangle(attributes);
    }

    @Override
    public Drawable getDrawable() {
        return rectangle;
    }

}

次に、呼び出すとき:

final List<Figure> figures = new ArrayList<Figure>();
figures.add(new State());
for (final Figure figure : figures) {
    figure.getDrawable().draw(); // prints "the rectangle"
}
于 2013-03-28T15:49:12.787 に答える