در مهندسی نرم‌افزار، **الگوی کامپوزیت** یک الگوی طراحی جداکننده است. الگوی کامپوزیت الگوی یک گروه از اشیاء را توصیف می‌کند که این اشیا به خاطر یکسان بودن نوعشان به یک شکل با آن‌ها رفتار می‌شود. هدف از کامپوزیت این است که اشیا را به ساختار درختی تبدیل کند. پیاده‌سازی الگوی کامپوزیت به استفاده‌کنندگان اجازه می‌دهد تا با اشیای جداگانه و مجموعه آن‌ها به یک شکل رفتار کنند.

### دیاگرام UML

الگوی کامپوزیت در UML.
جزء
* انتزاع برای تمام اجزای از جمله کامپوزیت
* یک رابط (اینترفیس) برای اشیاء کامپوزیت تعریف می‌کند
* (اختیاری) یک رابط برای دسترسی به والد یک جز در ساختار بازگشتی تعریف می‌کند و آن را در صورتی که مناسب باشد پیاده‌سازی می‌کند

برگ
* نشان دهنده اشیاء جز در کامپوزیت
* همه متدهای جزء را پیاده‌سازی می‌کند

کامپوزیت
* نشان دهنده یک جز کامپوزیت است (جزئی که فرزند دارد)
* روش‌هایی برای دستکاری فرزندان دارد
* همه متدهای جزء را معمولاً به صورت تفویض آن‌ها به فرزندان خود پیاده‌سازی می‌کند.

مثال
----

### Python

```
"""
Composite pattern example.
"""
from abc import ABCMeta, abstractmethod

NOT\_IMPLEMENTED = "You should implement this."

class Graphic:
    \_\_metaclass\_\_ = ABCMeta

    @abstractmethod
    def print(self):
        raise NotImplementedError(NOT\_IMPLEMENTED)

class CompositeGraphic(Graphic):
    def \_\_init\_\_(self):
        self.graphics = []

    def print(self):
        for graphic in self.graphics:
            graphic.print()

    def add(self, graphic):
        self.graphics.append(graphic)

    def remove(self, graphic):
        self.graphics.remove(graphic)

class Ellipse(Graphic):
    def \_\_init\_\_(self, name):
        self.name = name

    def print(self):
        print("Ellipse:", self.name)

ellipse1 = Ellipse("1")
ellipse2 = Ellipse("2")
ellipse3 = Ellipse("3")
ellipse4 = Ellipse("4")

graphic = CompositeGraphic()
graphic1 = CompositeGraphic()
graphic2 = CompositeGraphic()

graphic1.add(ellipse1)
graphic1.add(ellipse2)
graphic1.add(ellipse3)

graphic2.add(ellipse4)

graphic.add(graphic1)
graphic.add(graphic2)

graphic.print()

```

### جاوا

```
import java.util.ArrayList;

/\*\* "Component" \*/
interface Graphic {
 //Prints the graphic.
 public void print();
}

/\*\* "Composite" \*/
class CompositeGraphic implements Graphic {
 //Collection of child graphics.
 private final ArrayList<Graphic> childGraphics = new ArrayList<>();

 //Adds the graphic to the composition.
 public void add(Graphic graphic) {
 childGraphics.add(graphic);
 }
 
 //Prints the graphic.
 @Override
 public void print() {
 for (Graphic graphic : childGraphics) {
 graphic.print(); //Delegation
 }
 }
}

/\*\* "Leaf" \*/
class Ellipse implements Graphic {
 //Prints the graphic.
 @Override
 public void print() {
 System.out.println("Ellipse");
 }
}

/\*\* Client \*/
class CompositeDemo {
 public static void main(String[] args) {
 //Initialize four ellipses
 Ellipse ellipse1 = new Ellipse();
 Ellipse ellipse2 = new Ellipse();
 Ellipse ellipse3 = new Ellipse();
 Ellipse ellipse4 = new Ellipse();

 //Creates two composites containing the ellipses
 CompositeGraphic graphic2 = new CompositeGraphic();
 graphic2.add(ellipse1);
 graphic2.add(ellipse2);
 graphic2.add(ellipse3);
 
 CompositeGraphic graphic3 = new CompositeGraphic();
 graphic3.add(ellipse4);
 
 //Create another graphics that contains two graphics
 CompositeGraphic graphic1 = new CompositeGraphic();
 graphic1.add(graphic2);
 graphic1.add(graphic3);

 //Prints the complete graphic (Four times the string "Ellipse").
 graphic1.print();
 }
}

```

جستارهای وابسته
---------------

* قانون دمیتر

منابع
-----

1. ↑  Gamma, Erich; Richard Helm; Ralph Johnson; John M. Vlissides (1995). *Design Patterns: Elements of Reusable Object-Oriented Software*. Addison-Wesley. p. 395. ISBN 0-201-63361-2.

| * ن
* ب
* و
الگوهای طراحی |
| --- |
| الگوهای طراحی GO4 | 

|  |  |
| --- | --- |
| ایجاد | 
* الگوی کارخانه انتزاعی
* الگوی سازنده
* الگوی متد کارخانه شیء
* الگوی نمونه اولیه
* الگوی یگانه

 |
| ساختاری | 
* آداپتور
* پل
* کامپوزیت
* آذینگر
* نما
* مگس وزن
* وکالت

 |
| رفتاری | 
* زنجیره مسئولیت
* الگوی فرمان
* مفسر
* الگوی تکرار
* میانجی
* یادگاری
* ناظر
* وضعیت
* استراتژی
* متد الگو
* بازدیدگر

 |

 |
| Concurrencypatterns | 
* Active object
* Balking
* Binding properties
* Double-checked locking
* Event-based asynchronous
* Guarded suspension
* Join
* قفل
* مانیتور
* Proactor
* Reactor
* Read write lock
* زمان‌بندی
* الگوی مخزن نخ
* Thread-local storage

 |
| الگوهایمعماری | 
* Front controller
* مفسر
* مدل-نما-کنترل‌گر
* ADR
* Entity-component-system
* چندلایه
* Specification
* Publish–subscribe
* اشیای لخت
* Service locator
* ثبت کنشور
* Identity map
* شی دسترسی به داده
* شی انتقال داده
* وارونگی کنترل
* Model 2

 |
| دیگرالگوها | 
* Blackboard
* Business delegate
* Composite entity
* تزریق نیازمندی
* Intercepting filter
* بارگیری تنبلانه
* شیء ساختگی
* Null object
* استخر اشیاء
* Servant
* Twin
* Type tunnel
* Method chaining

 |
| کتاب‌ها | 
* *الگوهای طراحی*
* *Enterprise Integration Patterns*
* *Patterns of Enterprise Application Architecture*
* *Analysis patterns*

 |
| افراد | 
* کریستوفر الکساندر
* Erich Gamma
* Ralph Johnson
* John Vlissides
* گریدی بوچ
* کنت بک
* وارد کانینگهام
* مارتین فولر
* رابرت سسیل مارتین
* Jim Coplien
* Douglas Schmidt
* Linda Rising

 |
| جوامع | 
* The Hillside Group
* The Portland Pattern Repository

 |