لماذا نحن بحاجة إلى ديكور في ديكور نمط التصميم ؟

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

  •  07-07-2019
  •  | 
  •  

سؤال

على افتراض لدي الدرجة اسمه A, و أريد أن استخدام الديكور تصميم نمط.تصحيح لي إذا كنت مخطئا ولكن هذا العمل سوف تحتاج إلى إنشاء ديكور الصف ، يقول ADecorator, الذي سوف يعقد في إشارة إلى A سبيل المثال ، وغيرها من الديكور سوف يمتد هذا إلى إضافة وظائف.

أنا لا أفهم لماذا يجب علينا أن خلق الديكور بدلا من استخدام A سبيل المثال ؟

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

المحلول

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

الديكور نمط يعمل في سيناريوهات حيث هناك العديد من اختياري وظيفة كائن قد يكون.دون نمط ديكور سيكون لديك لإنشاء فئة مختلفة لكل كائن-خيار التكوين.أحد الأمثلة على هذا هو مفيدة جدا يأتي من أول رئيس أنماط التصميم كتاب أورايلي.فإنه يستخدم مقهى سبيل المثال هذا يبدو تماما مثل ستاربكس.

لذلك عليك الأساسية القهوة مع مثل طريقة التكلفة.

public double cost(){
     return 3.45;
}

ثم يمكن للعميل إضافة كريم الذي تكاليف 0.35 حتى يمكنك الآن إنشاء CoffeeCream الدرجة مع طريقة التكلفة:

public double cost(){
    return 3.80;
}

ثم العميل قد تريد موكا والتي تكلف 0.5 أنهم قد يريدون موكا مع كريم أو موكا بدون كريم.لذلك يمكنك إنشاء فئات CoffeeMochaCream و CoffeeMocha.ثم يريد عميل مزدوج كريم حتى يمكنك إنشاء فئة CoffeeCreamCream... الخ.ما كنت في نهاية المطاف مع فئة الانفجار.يرجى عذر الفقراء سبيل المثال تستخدم.انها قليلا في وقت متأخر وأنا أعلم أنها تافهة ولكنها لا تعبر عن وجهة.

بدلا من ذلك يمكنك إنشاء عنصر فئة مجردة مع مجردة طريقة التكلفة:

public abstract class Item{
    public abstract double cost();
}

و يمكنك إنشاء الخرسانة القهوة الطبقة التي تمتد البند:

public class Coffee extends Item{
    public double cost(){
       return 3.45;
    }
}

ثم يمكنك إنشاء CoffeeDecorator التي تمتد نفس واجهة تحتوي على عنصر.

public abstract class CoffeeDecorator extends Item{
     private Item item;
     ...
}

ثم يمكنك إنشاء الخرسانة الديكور لكل خيار:

public class Mocha extends CoffeeDecorator{

   public double cost(){
     return item.cost() + 0.5;
   }

}

لاحظ كيف الديكور لا يهمني ما نوع الكائن هو التفاف فقط طالما أنها عنصر ؟ ويستخدم التكلفة() من البند موضوع ببساطة يضيف نفقتها الخاصة.

public class Cream extends CoffeeDecorator{

   public double cost(){
     return item.cost() + 0.35;
   }

}

فمن الممكن الآن للحصول على عدد كبير من التشكيلات مع قليل من هذه الطبقات:على سبيل المثال

 Item drink = new Cream(new Mocha(new Coffee))); //Mocha with cream

أو

 Item drink = new Cream(new Mocha(new Cream(new Coffee))));//Mocha with double cream

وهلم جرا.

نصائح أخرى

وأنا لا يمكن أن يفسر ذلك أفضل بعد ذلك ويكيبيديا في.

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

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

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