ראשי > composite pattern > חלק שלישי
The Composite

כמה נקודות בקשר למימוש:
במימוש של ה Composite pattern ישנן נקודות רבות שיש להתייחס אליהן:
למעלה
קוד לדוגמה:
ציוד אלקטרוני כדוגמת מחשב אישי או מערכת סטריאו לעתים קרובות מאורגן כהיררכיות רקורסיביות של מרכיבים.
למשל, מארז יכול להכיל תושבת, bus ועוד. תושבת של מחשב יכולה להכיל כוננים ולוחות, bus יכול להכיל כרטיסים, וכן הלאה. מבנים כאלה יכולים להיות ממודלים באופן טבעי בעזרת ה Composite pattern. נגדיר מחלקה כללית, Equipment, אשר תגדיר ממשק כללי עבור מרכיב כלשהו בהיררכיה:

class Equipment {
public:
     virtual ~Equipment();

     const char* Name() { return _name;}

     virtual Watt Power();
     virtual Currency NetPrice();
     virtual Currency DiscountPrice();

     virtual void Add (Equipment*);
     virtual void Remove (Equipment*);
     virtual Iterator<Equipment*>* CreateIterator();
protected:
     Equipment (const char*);
private:
     Const char* _name;
};

Equipment מגדיר פעולות שמחזירות תכונות של חלק מסוים, כמו למשל צריכת כוח ומחיר. תת המחלקות של Equipment מממשות פעולות אלה בהתאם. Equipment גם מגדירה את הפעולה CreateIterator() שמחזירה Iterator עבור גישה לחלקיה. מימוש ברירת המחדל של פעולה זו הוא NullIterator אשר מבצע איטרציה על קבוצה ריקה. Subclass ים של Equipment יכולים להיות מסוג Leaf כמו כונני דיסקים, מעגלים משולבים ו switch ים:

class FloppyDisk : public Equipment {
public:
     FloppyDisk (const char*);
     virtual ~FloppyDisk();

     virtual Watt Power();
     virtual Currency NetPrice();
     virtual Currency DiscountPrice();
};

CompositeEquipment הוא מחלקת הבסיס עבור Equipment שמכיל Equipment ים אחרים. גם הוא subclass של Equipment:

class CompositeEquipment : public Equipment {
public:
     virtual ~CompositeEquipment();

     virtual Watt Power();
     virtual Currency NetPrice();
     virtual Currency DiscountPrice();

     virtual void Add(Equipment*);
     virtual void Remove (Equipment*);
     virtual Iterator<Equipment*>* CreateIterator();

protected:
     CompositeEquipment(const char*);
private:
     List<Equipment*> _equipment;
};

CompositeEquipment מגדיר את הפעולות עבור גישה וטיפול ב subequipment. הפעולות Add() ו Remove() מכניסות ומוחקות חלק מרשימת ה Equipment ים שנקראת כאן _equipment . הפעולה CreateIterator() מחזירה Iterator (מופע של ListIterator) אשר יכול לטייל על הרשימה. מימוש ברירת מחדל של NetPrice() יכול להשתמש ב CreateIterator() על מנת לסכום את ה NetPrice() ים של הילדים, שהם Equipment ים בעצמם.

Currency CompositeEquipment::NetPrice() {
     Iterator<Equipment*>* i = CreateIterator();
     Currency total = 0;

     For(i->First(); !i->IsDone(); i->Next()) {
     Total += i->CurrentItem()->NetPrice();
     }
     delete i;
     return total;
}

כעת אפשר לתאר תושבת במחשב כ subclass של CompositeEquipment שנקרא Chassis. הוא יירש את הפעולות שקשורות לילדים מ CompositeEquipment:

class Chassis : public CompositeEquipment {
public:
     Chassis(const char*);
     virtual ~Chassis;

     virtual Watt Power();
     virtual Currency NetPrice();
     virtual Currency DiscountPrice();
};

ואפשר להגדיר קונטיינרים אחרים ל Equipment , כמו Cabinet ו Bus , באופן דומה. זה נותן לנו כל מה שצריך כדי למדל את הציוד שיש במחשב (במחשב פשוט מאוד):

Cabinet* cabinet = new Cabinet ("PC Cabinet");
Chassis* chassis = new Chassis ("PC Chassis");

Cabinet->Add(chassis);

Bus* bus = new Bus("MCA Bus");
bus->Add(new Card("16Mbs Token Ting"));

Chassis->Add(bus);
Chassis->Add(new FloppyDisk("3.5in Floppy"));

Cout << "The net price is " << chassis->NetPrice() << endl;



למעלה







 
מה בעמוד:
 
מימוש
קוד לדוגמה