0

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

我们有许多对象形成一个类,例如相框。现在每个相框可以显示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 都应该将全局设置作为默认设置。稍后可以将其设置为不同的通过。

这是我的解决方案,但我想讨论是否有更好的解决方案。

我在所有 PictureFrames 都可以访问的 PictureFrame 类中添加了一个静态字段 PictureFrame.Instances。现在我可以遍历所有 PictureFrames 以将新的全局模式应用于所有帧。

此外,我还有第二个静态字段 PictureFrame.GlobalImageMode,如果我在所有帧上更改它并在 PictureFrame 的构造函数中读取它,我将在其中设置全局模式。GlobalImageMode 的设置器在 PictureFrame 类中也可以是静态的。

4

2 回答 2

1

在这里只是狂野的镜头......:为什么你不总是在当前帧模式中使用getter,其中包含一个条件:

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 回答