Visitorパターンの代わりに その2

| コメント(2) | トラックバック(0)
これの続編です。

drawだけじゃなくて他でも同様の処理をしたい場合、それぞれでforとswitch文、ましてやキャストを書くのは嫌です。
そういう場合、こんな風にすると良いと思います。
(ついでにFigTypeをint定数じゃなくてenumにしました)

// 図形クラス
class Figure
{
  public enum FigType { BOX, LINE };

  public abstract int getFigureType();
}

class Box extends Figure
{
  private int left, bottom, right, top;

  public FigType getFigureType() {
    return FIGTYPE.BOX;
  }

  // 以下、getter/setterなど
}

class Line extends Figure
{
  private int x1, y1, x2, y2;

  public FigType getFigureType() {
    return FIGTYPE.LINE;
  }

  // 以下、getter/setterなど
}

interface FigureProcessor
{
  public void process(Box);
  public void process(Line);
}

class FigureManager
{
  ArrayList<Figure> figList = new ArrayList<Figure>();

  public void processFigures(FigureProcessor processor)
  {
   for (Figure fig : figList) {
      switch (fig.getFigureType()) {
      case Figure.FigType.BOX:
        processor.process((Box)fig);
        break;
      case Figure.FigType.LINE:
        processor.process((Line)fig);
        break;
      default:
        assert false;
      }
    }
  }

  // 以下、Figureの追加メソッドなど
}

// 描画クラス
class Drawer implements FigureProcessor
{
  public void process(Box box) {
    // 描画処理
  }

  public void process(Line line) {
    // 描画処理
  }
}
というようにして、描画させる所では
  public void draw() {
    figureManager.processFigures(new Drawer());
  }
のようにします。

トラックバック(0)

トラックバックURL: http://soin.jp/mt/mt-tb.cgi/1743

    follow me on Twitter

    ウェブページ

    このブログ記事について

    このページは、ORIが2006年4月 9日 13:17に書いたブログ記事です。

    ひとつ前のブログ記事は「Visitorパターンの代わりに」です。

    次のブログ記事は「フリーのアウトライン化ソフトpotraceを使ってみました」です。

    最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

    Powered by Movable Type 4.23-ja