2009-04-04 9 views
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を作成し、簡単に各1のモードを変更することができます。

今、私はすべてのPictureFrames用のグローバルセッターを追加したいと思います。次に、新しいPictureFrameはそれぞれ、グローバル設定をデフォルトの設定として使用します。後で異なるスルーに設定することができます。

私の解決策ですが、より良いものがあるかどうか議論したいと思います。

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

さらに、私はすべてのフレームでそれを変更し、PictureFrameのコンストラクタでそれを読み取る場合、グローバルモードを設定する2番目の静的フィールドPictureFrame.GlobalImageModeを持っています。 GlobalImageModeの設定子は、PictureFrameクラスでも静的にすることができます。

+0

は、システムの要件や結果画面モードですこれまでの設計ですか? –

答えて

1

ここだけ野生のショットが...:なぜあなたはいつもそれで条件と現在のフレームモード用のゲッターを使用していない:

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

    private PictureMode CurrentMode { 
    get { 
     return globalMode ?? instanceMode; 
    } 
    } 
} 
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を拡張したり、複数のモードを使いたい場合は、イメージをラップしてどのモードかを示すデコレータオブジェクトを作成することができます。

関連する問題