1.1. Intent ¶
λΆλΆ-μ 체 κ³μΈ΅κ΅¬μ‘°λ₯Ό νννκΈ° μν΄ κ°μ²΄λ€μ νΈλ¦¬κ΅¬μ‘°λ‘ ꡬμ±νλ€. Composite λ ν΄λΌμ΄μΈνΈλ‘ νμ¬κΈ κ°κ°μ κ°μ²΄λ€κ³Ό κ°μ²΄μ λ¬Άμμ λμΌν λ°©λ²μΌλ‘ μ²λ¦¬νκ² ν΄μ€λ€.
1.2. Motivation ¶
λλ‘μ° μλν°λ νλ‘μ€κ³ μμ€ν
κ³Ό κ°μ κ·Έλν½ μ΄ν리μΌμ΄μ
μ λ¨μν μ»΄ν¬λνΈλ€μ μ°¨μμ λμ΄μ 볡μ‘ν λνλ€μ λ§λ€μ΄λ΄λλ° μ΄μ©λλ€. μ¬μ©μλ λ ν° μ»΄ν¬λνΈλ€μ νμ±νκΈ° μν΄ μ»΄ν¬λνΈλ€μ κ·Έλ£Ήνν μ μκ³ , λ ν° μ»΄ν¬λνΈλ€μ νμ±νκΈ° μν΄ λ κ·Έλ£Ήν ν μ μλ€. λ¨μν ꡬνλ°©λ²μΌλ‘λ Text λ Line κ°μ κ·Έλν½μ κΈ°λ³Έμμλ€μ λν ν΄λμ€λ€μ μ μν λ€, μ΄λ¬ν κΈ°λ³Έμμλ€μ λν΄ μ»¨ν
μ΄λ μν μ νλ λ€λ₯Έ ν΄λμ€μ μΆκ°νλ λ°©λ²μ΄ μλ€.
νμ§λ§, μ΄λ¬ν μ κ·Όλ°©λ²μλ λ¬Έμ μ μ΄ μλ€. λΉλ‘ λλΆλΆμ μκ°λμ μ¬μ©μκ° κ°κ°μ κ°μ²΄λ€μ λμΌνκ² μ·¨κΈνλ€ νλλΌλ, μ΄λ¬ν ν΄λμ€λ€μ μ΄μ©νλ μ½λλ λ°λμ κΈ°λ³Έκ°μ²΄μ 컨ν
μ΄λ κ°μ²΄λ₯Ό λ€λ₯΄κ² μ·¨κΈνμ¬ μ½λ©ν΄μΌ νλ€λ μ μ΄λ€. μ΄λ¬ν κ°μ²΄λ€μ ꡬλ³μ μ΄ν리μΌμ΄μ
μ 볡μ‘νκ² λ§λ λ€. CompositePatternμ κ°μ²΄λ€μ λν μ¬κ·μ μ‘°ν© λ°©λ²μ μμ ν¨μΌλ‘μ, ν΄λΌμ΄μΈνΈλ€λ‘ νμ¬κΈ μ΄λ¬ν ꡬλΆμ ν νμκ° μλλ‘ ν΄μ€λ€.
CompositePatternμ ν΅μ¬μ κΈ°λ³Έμμλ€κ³Ό κΈ°λ³Έμμλ€μ 컨ν
μ΄λλ₯Ό λ λ€ νννλ μΆμ ν΄λμ€μ μλ€. κ·Έλν½ μμ€ν
μμ μ¬κΈ° Graphic classλ₯Ό μλ‘ λ€ μ μκ² λ€. Graphic μ Draw μ κ°μ κ·Έλν½ κ°μ²΄λ€μ ꡬ체ννλ λͺ
λ Ήλ€μ μ μΈνλ€. λν Graphic μ Graphic μ μμν΄λμ€λ€ (tree ꡬ쑰μμμ parent-child κ΄κ³)μ λν΄ μ κ·Όνκ³ κ΄λ¦¬νλ λͺ
λ Ήλ€κ³Ό κ°μ λͺ¨λ composite κ°μ²΄λ€μ΄ 곡μ νλ λͺ
λ Ήμ΄λ€μ μ μΈνλ€.
Line, Rectangle, Text μ κ°μ μλΈ ν΄λμ€λ€μ (μμ class diagram μ°Έμ‘°) κΈ°λ³Έ κ·Έλν½ κ°μ²΄λ€μ μ μνλ€. μ΄λ¬ν ν΄λμ€λ€μ κ°κ° μ μ΄λ μ¬κ°ν, ν
μ€νΈλ₯Ό 그리λ 'Draw' operationμ ꡬννλ€. κΈ°λ³Έμ μΈ κ·Έλν½ κ΅¬μ±μμλ€μ μμμμλ€μ κ°μ§μ§ μμΌλ―λ‘, μ΄ μλΈ ν΄λμ€λ€μ μμμμκ³Ό κ΄λ ¨λ λͺ
λ Ήλ€μ ꡬννμ§ μλλ€.
Picture ν΄λμ€λ Graphic κ°μ²΄μ λν ν¬ν¨κ΄κ³λ₯Ό μ μνλ€. Picture λ Pictureμ childrenμ Draw λ©μλλ₯Ό νΈμΆνκ²λ Draw λ©μλλ₯Ό ꡬννλ€. κ·Έλ¦¬κ³ Pictureλ childμ κ΄λ ¨ν λͺ
λ Ήμ΄λ€μ μλ§κ² ꡬννλ€. Picture μΈν°νμ΄μ€λ Graphicμ μΈν°νμ΄μ€λ₯Ό νμ±νλ―λ‘, Picture κ°μ²΄λ λ€λ₯Έ Prictureλ€μ μ¬κ·μ μΌλ‘ μ‘°ν©ν μ μλ€.
λ€μ λ€μ΄μ΄κ·Έλ¨μ μ¬κ·μ μΌλ‘ Graphic κ°μ²΄λ€μ΄ μ‘°ν©λ μΌλ°μ μΈ composite κ°μ²΄μ ꡬ쑰λ₯Ό 보μ¬μ€λ€.
1.3. Applicability ¶
λ€μκ³Ό κ°μ κ²½μ°μ CompositePattern μ μ΄μ©ν μ μλ€.
- κ°μ²΄λ€μ λΆλΆ-μ 체 κ³μΈ΅ ꡬ쑰λ₯Ό νννκ³ μΆμλ
- ν΄λΌμ΄μΈνΈλ€μ΄ κ°κ°λ³ κ°μ²΄λ€κ³Ό κ°μ²΄λ€μ μ‘°ν©λ€μ μ°¨μ΄μ μ μ κ²½μ°μ§ μλλ‘ νκ³ μΆμ κ²½μ°. Compositeλ₯Ό μ΄μ©ν¨μΌλ‘μ¨, ν΄λΌμ΄μΈνΈλ€μ composite ꡬ쑰μ λͺ¨λ κ°μ²΄λ€μ λλ±νκ² μ·¨κΈν κ²μ΄λ€.
1.4. Structure ¶
A typical Composite object structure might look like this:
μΌλ°μ μΈ Composite κ°μ²΄κ΅¬μ‘°λ λ€μκ³Ό κ°μ λͺ¨μ΅μ λλ€.
μΌλ°μ μΈ Composite κ°μ²΄κ΅¬μ‘°λ λ€μκ³Ό κ°μ λͺ¨μ΅μ λλ€.
1.5. Participants ¶
- Component (Graphic)
- composition μμ κ°μ²΄λ€μ λν μΈν°νμ΄μ€λ₯Ό μ μΈνλ€.
- λͺ¨λ ν΄λμ€λ€μμ κΈ°λ³Έμ μΈ μΈν°νμ΄μ€μ λν κΈ°λ³Έ νμλ₯Ό ꡬννλ€.
- μμ μ»΄ν¬λνΈλ€μ μ κ·Όνκ³ κ΄λ¦¬νκΈ° μν μΈν°νμ΄μ€λ₯Ό μ μΈνλ€.
- (optional) μ¬κ· ꡬ쑰μμμ ν΄λΉ μ»΄ν¬λνΈμ λΆλͺ¨ ν΄λμ€λ‘ μ κ·ΌνκΈ° μν μΈν°νμ΄μ€λ₯Ό μ μνκ³ , μ μ νκ² κ΅¬ννλ€.
- composition μμ κ°μ²΄λ€μ λν μΈν°νμ΄μ€λ₯Ό μ μΈνλ€.
- Leaf (Rectangle, Line, Text, etc.)
- compositionμ leaf κ°μ²΄λ₯Ό νννλ€. leaf λ childrenλ₯Ό κ°μ§μ§ μλλ€.
- composition μ κΈ°λ³Έ κ°μ²΄λ€μ νμλ₯Ό μ μνλ€.
- compositionμ leaf κ°μ²΄λ₯Ό νννλ€. leaf λ childrenλ₯Ό κ°μ§μ§ μλλ€.
- Composite (Picture)
- childrenμ κ°μ§λ μ»΄ν¬λνΈλ€μ μν νμλ₯Ό μ μνλ€.
- μμ μ»΄ν¬λνΈλ€μ μ μ₯νλ€.
- Component μΈν°νμ΄μ€μ€ μμμ»΄ν¬λνΈ κ΄λ ¨ λͺ
λ Ήλ€μ ꡬννλ€.
- childrenμ κ°μ§λ μ»΄ν¬λνΈλ€μ μν νμλ₯Ό μ μνλ€.
- Client
- Componentμ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ compositionμ κ°μ²΄λ€μ μ‘°μνλ€.
- Componentμ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ compositionμ κ°μ²΄λ€μ μ‘°μνλ€.
1.6. Collaborations ¶
- ν΄λΌμ΄μΈνΈλ€μ Component ν΄λμ€μ μΈν°νμ΄μ€λ₯Ό μ΄μ©, composite ꡬ쑰μ κ°μ²΄λ€κ³Ό μνΈμμ©μ νλ€. λ§μΌ μνΈμμ©νλ κ°μ²΄κ° LeafμΈ κ²½μ°, ν΄λΉ μμ²μ μ§μ μ μΌλ‘ μ²λ¦¬λλ€. λ§μΌ μνΈμμ©νλ κ°μ²΄κ° CompositeμΈ κ²½μ°, Compositeλ ν΄λΉ μμ²μ μμ μ»΄ν¬λνΈλ€μκ² μ λ¬νλλ°, μμ μ»΄ν¬λνΈλ€μκ² ν΄λΉ μμ²μ μ λ¬νκΈ° μ λλ νμ μΆκ°μ μΈ λͺ
λ Ήλ€μ μνν μ μλ€.
1.7. Consequences ¶
CompositePattern μ
- κΈ°λ³Έ κ°μ²΄λ€κ³Ό λ³΅ν© κ°μ²΄λ€λ‘ ꡬμ±λ ν΄λμ€ κ³μΈ΅ ꡬ쑰λ₯Ό μ μνλ€. (μμκ΄κ³κ° μλ. μ¬κΈ°μλ μΌμ’
μ data-structureμ κ΄μ ) κΈ°λ³Έ κ°μ²΄λ€μ λ 볡μ‘ν κ°μ²΄λ€μ ꡬμ±ν μ μκ³ , κ³μμ μ΄κ³ μ¬κ·μ μΌλ‘ μ‘°ν©λ μ μλ€. ν΄λΌμ΄μΈνΈ μ½λκ° κΈ°λ³Έ κ°μ²΄λ₯Ό μν λ μ΄λμλ μ§ λ³΅ν© κ°μ²΄λ₯Ό μ·¨ν μ μλ€.
- ν΄λΌμ΄μΈνΈλ₯Ό λ¨μνκ² λ§λ λ€. ν΄λΌμ΄μΈνΈλ κ°κ°μ κ°μ²΄μ λ³΅ν© κ΅¬μ‘°μ²΄λ₯Ό λλ±νκ² μ·¨κΈν μ μλ€. ν΄λΌμ΄μΈνΈλ κ·Έλ€μ΄ λ€λ£¨λ €λ κ°μ²΄κ° Composite μΈμ§ Leaf μΈμ§ μ νμκ° μλ€. μ΄λ¬ν¨μ composition μ μ μνλ ν΄λμ€λ€μ λν΄ μκ΄μμ΄ ν¨μλ€μ λ¨μνκ² ν΄μ€λ€.
- μλ‘μ΄ μ’
λ₯μ μ»΄ν¬λνΈλ€μ μΆκ°νκΈ° μ½κ² ν΄μ€λ€. μλ‘ μ μλ Composite λ Leaf μ μλΈν΄λμ€λ€μ μλμ μΌλ‘ νμ¬μ ꡬ쑰λ€κ³Ό ν΄λΌμ΄μΈνΈ μ½λλ€κ³Ό μμ©νλ€. ν΄λΌμ΄μΈνΈ μ½λλ€μ μλ‘μ΄ Component ν΄λμ€λ€μ λν΄μ μμ λ νμκ° μλ€.
- λμμΈμ μ’ λ μΌλ°νμμΌμ€λ€. μλ‘μ΄ μ»΄ν¬λνΈλ₯Ό μΆκ°νκΈ° μ½λ€λ μ μ΄ λ¨μ μΌλ‘ μμ©νλ κ²½μ°λ compositeμ μ»΄ν¬ν΄νΈλ€λ‘ νμ¬κΈ μ νμ λκΈ° νλ€λ€λ μ μ΄ μλ€. λλλ‘ νΉμ μ»΄ν¬λνΈλ€λ§μ κ°μ§λ compositeλ₯Ό μν λκ° μμ κ²μ΄λ€. Composite μΈ κ²½μ°, μ΄λ¬ν μ νμ κ°μ λ λκΈ° μν΄ type systemμ μμ‘΄ν μ μκ² λλ€. κ·Έ λμ μ€μκ° μ²΄ν¬λ₯Ό μ΄μ©ν΄μΌ ν κ²μ΄λ€.
1.8. Implementation ¶
CompositePatternμ ꡬνν λ κ³ λ €ν΄μΌ ν μ¬λ¬κ°μ§ μ¬νλ€μ΄ μλ€.
- λΆλͺ¨μ μ°Έμ‘°μλ₯Ό λͺ
μνλΌ.
- μ»΄ν¬λνΈλ€μ 곡μ
- Component μΈν°νμ΄μ€μ μ΅λν
- Child κ΄λ¦¬ λͺ
λ Ήμ΄λ€μ μ μΈ
- Componentλ μ»΄ν¬λνΈλ€μ 리μ€νΈκ΅¬μ‘°λ₯Ό ꡬνν΄μΌ νλκ°?
- Child ordering
- μ±λ₯ν₯μμ μν caching
- λκ° μ»΄ν¬λνΈλ€μ μμ ν΄μΌ νλκ°?
- μ»΄ν¬λνΈλ€μ μ μ₯νκΈ° μν κ°μ₯ μ’μ μλ£κ΅¬μ‘°λ 무μμΈκ°?
1.9. Sample Code ¶
computer μ μ€ν
λ μ€ μ»΄ν¬λνΈλ€κ³Ό κ°μ μ₯μΉλ€ (Equipment) λ λ³΄ν΅ κ²©λ© κ³μΈ΅μ λΆλΆ-μ 체 μμΌλ‘ ꡬμ±λλ€. μλ₯Ό λ€μ΄ μμ (chassis) λ λλΌμ΄λΈλ€(νλλμ€ν¬ λλΌμ΄λΈ, νλ‘νΌ λμ€ν¬ λλΌμ΄λΈ λ±) κ³Ό ννλ€ (μ»΄ν¨ν° μΌμ΄μ€μ λμ νλ€) μ ν¬ν¨νκ³ , λ²μ€λ μΉ΄λλ€μ ν¬ν¨ν μ μκ³ , μΊλΉλ·μ μμμ λ²μ€ λ±λ±μ ν¬ν¨ν μ μλ€. μ΄λ¬ν ꡬ쑰λ μμ°μ€λ½κ² CompositePatternμΌλ‘ λͺ¨λΈλ§λ μ μλ€.
Equipment ν΄λμ€λ λΆλΆ-μ 체 κ³μΈ΅κ΅¬μ‘°μ λͺ¨λ equipmentλ€μ μν μΈν°νμ΄μ€λ₯Ό μ μνλ€.
~cpp 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 λ μ μμλͺ¨λ (power consumption)κ³Ό κ°κ²©(cost) λ±κ³Ό κ°μ equipmentμ μΌλΆμ μμ±λ€μ 리ν΄νλ λͺ
λ Ήλ€μ μ μΈνλ€. μλΈν΄λμ€λ€μ ν΄λΉ μ₯λΉμ ꡬ체μ μ’
λ₯μ λ°λΌ μ΄ λͺ
λ Ήλ€μ ꡬννλ€. Equipment λ λν Equipmentμ μΌλΆλ₯Ό μ κ·Όν μ μλ Iterator λ₯Ό 리ν΄νλ CreateIterator λͺ
λ Ήμ μ μΈνλ€. μ΄ λͺ
λ Ήμ κΈ°λ³Έμ μΈ κ΅¬νλΆλ λΉμ΄μλ μ§ν©μ λν NullIterator λ₯Ό 리ν΄νλ€.
Equipment μ μλΈν΄λμ€λ λμ€ν¬ λλΌμ΄λΈλ IC νλ‘, μ€μμΉ λ±μ νννλ Leaf ν΄λμ€λ₯Ό ν¬ν¨ν μ μλ€.
~cpp class FloppyDisk : public Equipment { public: FloppyDisk (const char*); virtual ~FloppyDisk (); virtual Watt Power (); virtual Currency NetPrice (); virtual Currency DiscountPrice (); };
CompositeEquipment λ λ€λ₯Έ equipmentλ₯Ό ν¬ν¨νλ equipmentμ κΈ°λ³Έν΄λμ€μ΄λ€. μ΄λ λν Equipment μ μλΈν΄λμ€μ΄λ€.
~cpp class CompositeEquipment : public Equipment { public: virtual ~CompositeEquipment (); virtual Watt Power (); virtual Currency NetPrice (); virtual Currency DiscountPrice (); virtual void Add (Equipement* ); virtual void Remove (Equipment* ); virtual Iterator<Equipment*>* CreateIterator (); protected: CompositeEquipment (const char*); private: List<Equipment*>_equipment; };
CompositeEquipment λ sub-equipment μ μ κ·Όνκ³ κ΄λ¦¬νκΈ° μν λͺ
λ Ήλ€μ μ μνλ€. μ΄ λͺ
λ Ήλ€μΈ Add μ Removeλ _equipment λ©€λ²μ μ μ₯λ equipment μ 리μ€νΈλ‘λΆν° equipment λ₯Ό μΆκ°νκ±°λ μμ νλ€. CreateIterator λͺ
λ Ήμ μ΄ λ¦¬μ€νΈλ€μ νμν μ μλ iterator(ꡬ체μ μΌλ‘ ListIteratorμ μΈμ€ν΄μ€) λ₯Ό 리ν΄νλ€.
NetPrice μ κΈ°λ³Έ ꡬνλΆλ sub-equipment μ net priceμ ν©μ ꡬνκΈ° μν΄ CreateIteratorλ₯Ό μ΄μ©ν κ²μ΄λ€.
~cpp 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; }
μ, μ°λ¦¬λ μ»΄ν¨ν° μμλ₯Ό Chassis λΌ λΆλ¦¬λ CompositeEquipmentμ μλΈν΄λμ€λ‘μ ννν μ μλ€. Chassisλ CompositeEquipmentλ‘λΆν° μμ-κ΄λ ¨ λͺ
λ Ήμ΄λ€μ μμλ°λλ€.
~cpp class Chassis : public CompositeEquipment { public: Chassis (const char*); virtual ~Chassis (); virtual Watt Power (); virtual Currency NetPrice (); virtual Currency DiscountPrice (); };
μ°λ¦¬λ κ°λ¨ν λ°©λ²μΌλ‘ Cabinet λ Bus μ κ°μ λ€λ₯Έ equipment 컨ν
μ΄λλ₯Ό μ μν μ μλ€. μ΄λ‘μ μ°λ¦¬κ° κ°μΈμ© μ»΄ν¨ν°μ equipmentλ€μ 쑰립νκΈ° μν΄ (κ½€ κ°λ¨νκ²) νμλ‘ νλ λͺ¨λ κ²λ€μ΄ μ£Όμ΄μ‘λ€.
~cpp 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 Ring")); chassis->Add (bus); chassis->Add (new FloppyDisk ("3.5in Floppy")); cout << "The net price is " << chassis->NetPrice () << endl;
1.10. Known Uses ¶
CompositePatternμ μλ κ±°μ λͺ¨λ κ°μ²΄μ§ν₯ μμ€ν
μμ μ°Ύμ μ μλ€. Smalltalk μ Model/View/Container KP88 μ original View ν΄λμ€λ Compositeμ΄λ©°, ET++ (VObjects WGM88) μ΄λ InterViews (Styles LCI+92, Graphics VL88, Glyphs CL90)λ± κ±°μ λλΆλΆμ μ μ μΈν°νμ΄μ€ ν΄ν·κ³Ό νλ μμν¬κ° ν΄λΉ κ³Όμ μ λ°λ₯Έλ€. Model/View/Controller μ original Viewμμ μ£Όλͺ©ν λ§ν μ μ subview μ μ§ν©μ κ°μ§λ€λ κ²μ΄λ€. λ€μ λ§νλ©΄, Viewλ Component class μ΄μ Composite class μ΄λ€. Smalltalk-80 μ Release 4.0 μ View μ CompositeView μ μλΈν΄λμ€λ₯Ό κ°μ§λ VisualComponent ν΄λμ€λ‘ Model/View/Controller λ₯Ό λ³κ²½νλ€.
RTL Smalltalk μ»΄νμΌλ¬ νλ μμν¬ JML92 λ CompositePatternμ λ리 μ¬μ©νλ€. RTLExpression μ parse treeλ₯Ό μν Component ν΄λμ€μ΄λ€. RTLExpression μ BinaryExpression κ³Ό κ°μ μλΈν΄λμ€λ₯Ό κ°μ§λλ°, μ΄λ RTLExpression κ°μ²΄λ€μ μμμΌλ‘ ν¬ν¨νλ€. μ΄ ν΄λμ€λ€μ parse treeλ₯Ό μν΄ composite ꡬ쑰λ₯Ό μ μνλ€. RegisterTransfer λ νλ‘κ·Έλ¨μ Single Static Assignment(SSA) ννμ μ€κ°λ¬Όμ μν Component ν΄λμ€μ΄λ€. RegisterTransfer μ Leaf μλΈν΄λμ€λ€μ λ€μκ³Ό κ°μ λ€λ₯Έ ννμ static assignment λ₯Ό μ μνλ€.
λ λ€λ₯Έ μλΈν΄λμ€λ‘μ RegisterTransferSetμ΄ μλ€. RegisterTransferSet λ νλ²μ μ¬λ¬ registerλ₯Ό λ³κ²½νλ assignmentλ₯Ό νννκΈ° μν Composite ν΄λμ€μ΄λ€.
- λκ°μ λ μ§μ€ν°λ‘ λͺ
λ Ήμ μννκ³ μΈλ²μ§Έ λ μ§μ€ν°λ‘ κ²°κ³Όκ°μ ν λΉνλ κΈ°λ³Έμ μΈ assignment
- source register λ₯Ό κ°μ§μ§λ§, destination register λ₯Ό κ°μ§μ§ μλ, registerκ° ν΄λΉ 루ν΄μ΄ λ¦¬ν΄ λ λ€μ μ΄μ©λλ assignment
- destination register λ₯Ό κ°μ§μ§λ§, source register λ₯Ό κ°μ§μ§ μλ, ν΄λΉ 루ν΄μ΄ μμλκΈ° μ μ register κ° assignλλ assignment
λ λ€λ₯Έ μλΈν΄λμ€λ‘μ RegisterTransferSetμ΄ μλ€. RegisterTransferSet λ νλ²μ μ¬λ¬ registerλ₯Ό λ³κ²½νλ assignmentλ₯Ό νννκΈ° μν Composite ν΄λμ€μ΄λ€.
Another example of this pattern occurs in the financial domain, where a portfolio aggregates individual assets. You can support complex aggregations of assets by implementing a portfolio as a Composite that conforms to the interface of an individual asset BE93.
CompositePatternμ λλ€λ₯Έ μλ κ°κ°μ μμ°λ€μ ν¬ν¨νλ portfolioμΈ financial domain μμ λνλλ€. portfolio λ₯Ό κ°κ°μ asset μ μΈν°νμ΄μ€λ₯Ό ꡬμ±νλ Composite λ‘ κ΅¬νν¨μΌλ‘μ¨ λ³΅μ‘ν assetμ ν¬ν¨κ΄κ³λ₯Ό μ§μν μ μλ€.
CommandPatternμ MacroCommand Composite ν΄λμ€λ‘ Command κ°μ²΄λ€μ΄ μ‘°ν©λκ³ λμ΄νλ λ°©λ²μ λν΄ μμ νλ€.
1.11. Related Patterns ¶
- μ’
μ’
μ»΄ν¬λνΈ-λΆλͺ¨ μ°κ²°μ ChainOfResponsibilityPatternμ μ΄μ©λλ€.
- DecoratorPattern μ μ’
μ’
Compositeμ ν¨κ» μ΄μ©λλ€. descorator μ composite κ° ν¨κ» μ΄μ©λ λ, κ·Έκ²λ€μ λ³΄ν΅ κ³΅ν΅λ λΆλͺ¨ ν΄λμ€λ₯Ό κ°μ§ κ²μ΄λ€. κ·Έλ¬ν κ²½μ° decoratorλ Add, Remove, GetChild μ κ°μ Compoent μ μΈν°νμ΄μ€λ₯Ό μ§μν΄μΌ νλ€.
- FlyweightPattern lets you share components, but they can no longer refer to their parents.
- FlyweightPattern μ μ»΄ν¬λνΈλ€μ 곡μ ν μ μλλ‘ ν΄μ£Όμ§λ§, κ·Έλ€μ λΆλͺ¨κ°μ²΄λ₯Ό μ°Έμ‘°ν μ μλ€.
- IteratorPattern μ compositeλ€μ νμν λ μ΄μ©λ μ μλ€.
- VisitorPatternμ λͺ
λ Ήλ€κ³Ό Composite μ Leaf ν΄λμ€ μ¬μ΄λ₯Ό κ°λ‘μ§λ¬ λΆν¬λ μ μλ νμλ€μ μ§μννλ€.