سؤال

وكان فهمي السابق للنمط الديكور أنك ترث Window مع WindowDecorator، ثم في أساليب متجاوزة، والقيام ببعض الأعمال الإضافية قبل استدعاء تنفيذ Window من الطرق المذكورة. مشابهة لما يلي:

public class Window
{
    public virtual void Open()
    {
        // Open the window
    }
}

public class LockableWindow : Window // Decorator
{
    public virtual void Open()
    {
        // Unlock the window
        base.Open();
    }
}

ولكن هذا hardcodes أساسا الديكور، فكيف سيكون هذا ريفاكتوريد استخدام تركيبة بدلا من الميراث؟

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

المحلول

عذرا يا C # هو قليلا (OK، جدا) صدئ، لذلك قد يكون هناك بعض الأخطاء في بناء الجملة، ولكن الفكرة الأساسية هو الصحيح.

public interface IWindow
{
    void Open();
}

public class Window : IWindow
{
    public virtual void Open()
    {
        // Open the window
    }
}

public class LockableWindow : IWindow
{
    private IWindow _wrappedWindow;

    public LockableWindow(IWindow wrappedWindow)
    {
        _wrappedWindow = wrappedWindow;
    }

    public virtual void Open()
    {
        // TODO Unlock window if necessary
        _wrappedWindow.open();
    }
}

والشيء الرئيسي لاحظت هي واجهة IWindow جديدة؛ وهذا ما يسمح لك الاستمرار في استخدام تعدد الأشكال.

نصائح أخرى

وهذه النقطة من نمط ديكور هو تعزيز كائن مع بعض وظائف (إضافة مثل التخزين المؤقت إلى دفق) بطريقة شفافة إلى الطالب. من أجل استخدامها على نحو أكثر فعالية، وتريد أن تكون قادرة على مبادلة في تنفيذ زينت دون إعادة هيكلة الكود، وهو ما يعني أساسا أن تحتاج إلى الحفاظ على التسلسل الهرمي الميراث.

ما هو القلق الفعلي، أي ما يعني "هذه رموز الصعبة وسام" تعني في حقيقة الأمر؟ أي نوع من المشاكل هل نتصور الرغبة في حلها؟ ومن المحتمل أن يكون الديكور ليست هي النهج الصحيح ...

ويمكنك ببساطة أن يكون LockableWindow الخاص بك تحديد منشئ التي تأخذ مثيل من نوع، نافذة، وأنه سيتم تزيين. يمكنك أيضا أن تفعل ذلك عن طريق خصائص.

public class Window
{    
  public virtual void Open()    
  {        
   // Open the window    
  }
}

public class LockableWindow // Decorator
{    
  private Window window;

  public LockableWindow(Window w)
  {
     window = w;
  }      

  public virtual void Open()    
  {        
    // Unlock the window        
    window.Open();    
  }
}

وما أفهمه من نمط الديكور هو أن الغرض منه هو السماح لتعزيز وقت التشغيل من قدرات الكائن. في تفسير ويكيبيديا، فإنها تركز على كومة المكون لهذا الغرض.

وأنا لا أتكلم C # في كل شيء، لذلك هذا هو (الواضح) PHP-العش. ويبدو أن فكرة صحيحة ستكون كما يلي:

class image{

     function open(){ ... }

} //end of class

class decoratedImage extends image{

     private goodies=array(); //the alleged 'component stack'

     function addGoodie($item){
          $this->goodies[]=$item;
     }

     function open()}{

          parent::open();
          foreach ($this->goodies as $componentClassName){

               $component=new $componentClassName();
               $component->apply($this);

          }

     }

} //end of class

ويا أصحاب الخبرة، يرجى شرح قطع الاتصال.

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