العديد من الأشياء مع الدولة العالمية والمحلية

StackOverflow https://stackoverflow.com/questions/717587

  •  23-08-2019
  •  | 
  •  

سؤال

أنا أبحث عن أفضل تصميم للوضع التالي.

لدينا العديد من الكائنات التي تشكل فئة واحدة، على سبيل المثال إطار الصورة. الآن يمكن لكل من إطارات الصور عرض 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.
    }
}

يمكننا الآن إنشاء بعض الإطار الزمني مع صور مختلفة وتغيير الوضع بسهولة لكل واحد.

الآن أريد إضافة مجموعة عالمية لجميع أطراف الصور. ثم يجب أن يأخذ كل picteframe جديد الإعداد العالمي كواحد افتراضي. يمكن ضبطه لاحقا على مختلف من خلال.

هنا حلاي، لكنني أريد مناقشة إذا كان هناك واحد أفضل.

أضفت صورة حقل ثابتة.Instances إلى فئة PictureFame حيث يمكن الوصول إلى جميع pictureframes. الآن يمكنني التكرار فوق جميع الأراضي اللوحة لتطبيق الوضع العالمي الجديد على جميع الإطارات.

بالإضافة إلى ذلك، لدي حقل ثابت ثاني PictureFrame.globalimageMode حيث قمت بتعيين الوضع العالمي إذا قمت بتغييره على جميع الإطارات وقراءته في منشئ PictureFame. يمكن أن يكون STERER الخاص ب GlobalImageMode ثابتا في فئة PictureFame، أيضا.

هل كانت مفيدة؟

المحلول

فقط بالرصاص البرية هنا ...: لماذا لا تستخدم 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();

بالتناوب، إذا كنت لا ترغب في تمديد الصورة أو تريد أن يكون لديك أوضاع متعددة، فيمكنك إنشاء كائن Decorator لفه الصورة في ويقول ما الوضع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top