我正在为以下情况寻找最好的设计。
我们有很多对象形成一个类,例如一个相框。现在每个相框可以显示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.
}
}
我们现在可以使用不同的图片创建一些PictureFrame,并轻松更改每个图片的模式。
现在我想为所有PictureFrame添加一个全局设置器。然后,每个新的PictureFrame都应将全局设置作为默认设置。它可以在以后设置为不同的。
这是我的解决方案,但我想讨论是否有更好的解决方案。
我在PictureFrame类中添加了一个静态字段PictureFrame.Instances,其中所有PictureFrame都可以访问。现在,我可以迭代所有PictureFrames,将新的全局模式应用于所有帧。
另外我有第二个静态字段PictureFrame.GlobalImageMode,如果我在所有Frame上更改它并在PictureFrame的构造函数中读取它,我将设置全局模式。 GlobalImageMode的setter在PictureFrame类中也可以是静态的。
答案 0 :(得分:1)
在这里疯狂射击......:为什么不总是使用getter进行当前帧模式,其中包含条件:
class PictureFrame {
private PictureMode instanceMode;
private static PictureMode? globalMode;
private PictureMode CurrentMode {
get {
return globalMode ?? instanceMode;
}
}
}
答案 1 :(得分: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或者您想拥有多种模式,您可以创建一个装饰器对象来包装图像并说明它是什么模式。