0

以下の状況に最適なデザインを探しています。

たとえば額縁など、1 つのクラスから多くのオブジェクトがあります。これで、各額縁に 3 種類の画像を表示できるようになりました。1) 顔 2) スクリーンショット 3) 空っぽ

簡単だ:

public enum PictureMode 
{
    Face,
    Screen,
    None
}

public class PictureFrame {
    private PictureMode mode;
    public PictureMode Mode 
    {
        get { retrun mode; }
        set { /* set currentPicture to the correct one */ }
    }

    private Image currentPicture;
    private Image face;
    private Image screen;
    private Image empty;

    public PictureFrame(Image face, Image screen) {
        this.face = face;
        this.screen = screen;

        mode = PictureMode.None; // Maybe this is our default.
    }
}

これで、異なる画像でいくつかの PictureFrames を作成し、それぞれのモードを簡単に変更できるようになりました。

ここで、すべての PictureFrames にグローバル セッターを追加したいと考えています。次に、新しい各 PictureFrame は、グローバル設定をデフォルトとして使用する必要があります。後で別のスルーに設定できます。

これが私の解決策ですが、より良い解決策があるかどうかについて話し合いたいと思います。

すべての PictureFrame に到達できる PictureFrame クラスに静的フィールド PictureFrame.Instances を追加しました。これで、すべての PictureFrames を繰り返し処理して、新しいグローバル モードをすべてのフレームに適用できます。

In addition I have a second static field PictureFrame.GlobalImageMode where I set the global mode if I change it on all Frames and read it in the Constructor of the PictureFrame. The setter for the GlobalImageMode can be static in the PictureFrame class, too.

4

2 に答える 2

1

ここでただのワイルドショット...:現在のフレームモードに条件付きのゲッターを常に使用しないのはなぜですか:

class PictureFrame {
  private PictureMode instanceMode;
  private static PictureMode? globalMode;

  private PictureMode CurrentMode {
    get {
       return globalMode ?? instanceMode;
    }
  }
}
于 2009-04-04T19:10:30.647 に答える
0

問題のステートメントを正しく理解していれば、これは必要なものに似ていると思います。

public class Face extends Image { }
public class Screen extends Image { }

public class PictureFrame {
  private Image picture = null;

  public PictureFrame(Image newPicture) {
    this.setPicture(newPicture);
  }

  public setPicture(Image newPicture) {
    this.picture = newPicture;
  }
}

public class PictureFactory {
  private static Image defaultPicture = null;

  public static void setDefaultPicture(Image newPicture) {
    PictureFactory.defaultPicture = newPicture;
  }

  public static Image getDefaultPicture() {
    return PictureFactory.defaultPicture;
  }

  public static PictureFrame getNewPictureFrame() {
    return new PictureFrame(PictureFactory.defaultPicture);
  }
}

public class PictureFrameManager {
  private static PictureManager INSTANCE = new PictureManager();
  private Vector<PictureFrame> frames = new Vector<PictureFrame>();

  public static PictureFrameManager getInstance() {
    return PictureManager.INSTANCE;
  }

  private PictureFrameManager() {}

  private void addPictureFrame(PictureFrame frame) {
    this.frames.add(frame);
  }

  private void setFramesToDefault() {
    Image defaultPicture = PictureFactory.getDefaultPicture();
    Enumeration<PictureFrame> iFrames = frames.elements();
    while(iFrames.hasMoreElements()) {
      iFrames.nextElement().setPicture(defaultPicture);
    }
  }
}

次の方法で使用します。

Face face = new Face();
//...do something to load the face object here

PictureFactory.setDefaultPicture(face);
PictureFrame frame = PictureFactory.getNewPictureFrame();

PictureFrameManager manager = PictureFrameManager.getInstance();
manager.addPictureFrame(frame);

Screen screen = new Screen();
//...do something to load the screen object here

PictureFactory.setDefaultPicture(screen);
manager.setFramesToDefault();

別の方法として、Image を拡張したくない場合、または複数のモードが必要な場合は、デコレータ オブジェクトを作成してイメージをラップし、それがどのモードであるかを示すことができます。

于 2009-04-04T19:07:48.763 に答える