문제
다음 상황에 가장 적합한 디자인을 찾고 있습니다.
예를 들어 그림 프레임과 같은 많은 객체가 하나의 클래스를 형성합니다. 이제 각 사진 프레임에는 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에 대한 글로벌 세터를 추가하고 싶습니다. 그런 다음 각각의 새 PictureFrame은 기본 설정으로 전역 설정을 가져와야합니다. 나중에 다른 통과로 설정할 수 있습니다.
여기 내 해결책이 있지만 더 나은 솔루션이 있는지 논의하고 싶습니다.
모든 그림 프레임에 도달 할 수있는 PictureFrame 클래스에 정적 필드 PictureFrame.instances를 추가했습니다. 이제 모든 사진 프레임을 반복하여 새로운 글로벌 모드를 모든 프레임에 적용 할 수 있습니다.
또한 두 번째 정적 필드 PictureFrame.GlobalimageMode가 있으며 모든 프레임에서 변경하고 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();
또는 이미지를 확장하지 않거나 여러 모드를 갖고 싶다면 데코레이터 객체를 만들어 이미지를 랩핑하고 어떤 모드인지 말할 수 있습니다.