문제

다음 상황에 가장 적합한 디자인을 찾고 있습니다.

예를 들어 그림 프레임과 같은 많은 객체가 하나의 클래스를 형성합니다. 이제 각 사진 프레임에는 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();

또는 이미지를 확장하지 않거나 여러 모드를 갖고 싶다면 데코레이터 객체를 만들어 이미지를 랩핑하고 어떤 모드인지 말할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top