الديكور نمط عن طريق تكوين بدلا من الميراث
-
06-07-2019 - |
سؤال
وكان فهمي السابق للنمط الديكور أنك ترث 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
ويا أصحاب الخبرة، يرجى شرح قطع الاتصال.