我在寻找以下情况的最佳设计。

我们有许多对象形成一个类,例如一个图象帧。现在每一个图像帧可以显示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.Instances到PictureFrame指令类,其中所有PictureFrames可达。现在我可以在所有PictureFrames迭代到新的全局模式适用于所有的帧。

在另外我有一个第二静磁场PictureFrame.GlobalImageMode其中I设置的全局模式,如果我改变它的所有帧,并在PictureFrame指令的构造读取它。用于GlobalImageMode装定可以在PictureFrame指令类的静态得。

有帮助吗?

解决方案

就狂射这里...:你为什么不一直在使用它的getter当前帧模式的条件:

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

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

其他提示

如果我理解正确的陈述问题,我认为这是类似于你所需要的:

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

另外,如果你不希望扩展的图像或你想有多种模式,你可以创建一个装饰物来包装形象和说,这是什么模式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top