2009-04-04 4 views
0

Je cherche le meilleur design pour la situation suivante.De nombreux objets avec l'état global et local

Nous avons de nombreux objets d'une classe, par exemple un cadre d'image. Maintenant, chacun des cadres d'image peut afficher 3 types d'image. 1) une face 2) une capture d'écran 3) vide

Cest facile:

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. 
    } 
} 

Nous pouvons maintenant créer des cadres d'image avec des images différentes et facilement changer le mode pour chacun.

Maintenant je veux ajouter un setter global pour tous les PictureFrames. Ensuite, chaque nouveau PictureFrame doit prendre le paramètre global par défaut. Il peut plus tard être réglé à travers un différent.

Voici ma solution, mais je veux discuter s'il y en a une meilleure.

J'ai ajouté un champ statique PictureFrame.Instances à la classe PictureFrame où tous les PictureFrames sont accessibles. Maintenant, je peux itérer sur toutes les PictureFrames pour appliquer le nouveau mode global à tous les cadres.

En outre j'ai un deuxième champ statique PictureFrame.GlobalImageMode où je place le mode global si je le change sur toutes les images et le lis dans le constructeur du PictureFrame. Le setter pour le GlobalImageMode peut aussi être statique dans la classe PictureFrame.

+0

Le mode d'image une exigence du système ou du fait de la conception jusqu'à présent? –

Répondre

1

tir Juste sauvage ici ...: Pourquoi ne pas vous utilisez toujours getter pour le mode image en cours avec une condition en elle:

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

    private PictureMode CurrentMode { 
    get { 
     return globalMode ?? instanceMode; 
    } 
    } 
} 
0

Si je comprends bien l'énoncé du problème, je pense que ce qui est similaire à ce que vous avez besoin:

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); 
    } 
    } 
} 

Vous pouvez l'utiliser via:

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(); 

Alternativement, si vous ne voulez pas étendre Image ou vous voulez avoir plusieurs modes, vous pouvez créer un objet décorateur pour envelopper l'image et dire quel est le mode.

Questions connexes