- Structural pattern
- The intent of this pattern is to compose objects into tree structures to represent part-whole hierarchies. As such it lets client treat individual objects and compositions of object uniformly : as if they all were individual objects.- XML document structure
- Composing a drawing
 
- Composite:- Stores child components and defines behavior for components having children.
- Leaf :- Leaf represents leaf objects in the composition, and has no children. It defines behavior for primitive objects in the composition.
- Client:- Manipulates objects in the compositions through the component interface.
- Makes the client simple
- Easy to add new kinds of components – OC principle is maintained
- It can make the overall system too generic – disadvantage
- Related Patterns :- Chain of Responsibility, Iterator pattern, Visitor pattern
 
															
			FileSystem
								
				
				
					namespace compositepattern
{
    public abstract class FileSystemItem
    {
        public string Name { get; set; }
        public abstract long GetSize();
        public FileSystemItem(string name)
        {
            Name = name;   
        }
    }
    public class File : FileSystemItem
    {
        private readonly long _size;
        public File(string name,long size):base(name)
        {
            _size = size;
        }
        public override long GetSize()
        {
            return _size;
        }
    }
    public class Folder : FileSystemItem
    {
        private List _fileSystemItem { get; set; } = new();
      
        public Folder(string name):base(name)
        {
        }
        public void Add(FileSystemItem itemToAdd)
        {
            _fileSystemItem.Add(itemToAdd);
        }
        public void Remove(FileSystemItem itemToAdd)
        {
            _fileSystemItem.Remove(itemToAdd);
        }
        public override long GetSize()
        {
            var totalsize = 0L;
            _fileSystemItem.ForEach(fileItem => {
                totalsize += fileItem.GetSize();
            });
            return totalsize;
        }
    }
}
  
				
			
		
			PROGRAM.CS
								
				
				
					// See https://aka.ms/new-console-template for more information
using compositepattern;
var rootFolder = new compositepattern.Folder("RootFolder");
var rootFile = new compositepattern.File("rootfile", 100);
var folder1= new compositepattern.Folder("folder1");
var folder2= new compositepattern.Folder("folder2");
rootFolder.Add(rootFile);
rootFolder.Add(folder1);
rootFolder.Add(folder2);
var folder1file1 = new compositepattern.File("folder1file1", 300);
var folder1file2 = new compositepattern.File("folder1file2", 300);
var folder2file = new compositepattern.File("folder2file", 500);
folder1.Add(folder1file1);
folder1.Add(folder1file2);
folder2.Add(folder2file);
Console.WriteLine(rootFolder.GetSize());
Console.WriteLine(folder1.GetSize());
Console.WriteLine(folder2.GetSize()); 
				
			
		
			OUTPUT
								
				 
															1200
600
500
			GITHUB
								
				