Frage

Ich suche das beste Design für die folgende Situation.

Wir haben viele Objekte einer Klasse, zum Beispiel einen Bilderrahmen.Jetzt kann jeder der Bilderrahmen 3 Bildtypen anzeigen.1) ein Gesicht 2) ein Screenshot 3) leer

Das ist einfach:

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

Wir können jetzt einige PictureFrames mit unterschiedlichen Bildern erstellen und den Modus für jedes einzelne einfach ändern.

Jetzt möchte ich einen globalen Setter für alle PictureFrames hinzufügen.Dann sollte jeder neue PictureFrame die globale Einstellung als Standard übernehmen.Es kann später auf einen anderen Durchgang eingestellt werden.

Hier ist meine Lösung, aber ich möchte diskutieren, ob es eine bessere gibt.

Ich habe der PictureFrame-Klasse ein statisches Feld „PictureFrame.Instances“ hinzugefügt, in dem alle PictureFrames erreichbar sind.Jetzt kann ich alle PictureFrames durchlaufen, um den neuen globalen Modus auf alle Frames anzuwenden.

Zusätzlich habe ich ein zweites statisches Feld PictureFrame.GlobalImageMode, in dem ich den globalen Modus einstelle, wenn ich ihn auf allen Frames ändere und ihn im Konstruktor des PictureFrame einlese.Der Setter für GlobalImageMode kann auch in der PictureFrame-Klasse statisch sein.

War es hilfreich?

Lösung

Just wilder Schuss hier ...: Warum gehst ich nicht immer mit einer Bedingung darin Getter für aktuellen Frame-Modus verwenden:

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

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

Andere Tipps

Wenn ich die Problemstellung richtig verstehe, denke ich, dass dies Ihrem Bedarf ähnelt:

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

Sie nutzen es über:

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

Wenn Sie Image nicht erweitern möchten oder mehrere Modi haben möchten, können Sie alternativ ein Dekorationsobjekt erstellen, um das Bild einzuschließen und anzugeben, um welchen Modus es sich handelt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top