Инструменты пользователя

Инструменты сайта


pattern_composite

Назад

Паттерн Компоновщик объединяет объекты в древовидную структуру для представления иерархии от частного к целому. Компоновщик позволяет клиентам обращаться к отдельным объектам и к группам объектов одинаково.

Достоинства:

  • В систему легко добавлять новые примитивные или составные объекты, так как Паттерн Компоновщик использует общий базовый класс Component.
  • Код клиента имеет простую структуру – примитивные и составные объекты обрабатываются одинаковым образом.
  • Паттерн Компоновщик позволяет легко обойти все узлы древовидной структуры

Недостатки:

  • Неудобно осуществить запрет на добавление в составной объект Composite объектов определенных типов.

Замечания данный паттерн напоминает работу компонента из Swing в JAVA.

Component
public interface Component
{
    public void Display();    
}
 
 
class Composite implements Component
{
    private List<Component> children  = new ArrayList<Component>();
    private String name;
 
    public Composite(String name)
    {
        this.name = name;
    }
 
    public void Add(Component c)
    {
        children.add(c);
    }
 
    public void Remove(Component c)
    {
        children.remove(c);
    }
 
    public void Display()
    {
        System.out.println(name);
        for(Component child: children)
        {
            child.Display();
        }
    }   
}
 
class Leaf implements Component 
{
    private String name;
 
    public Leaf(String name)
    {
        this.name = name;
    }
 
    public void Display()
    {
        System.out.println(name);
    }
 
}
Main
public class Main
{
    public static void main(String[] args)
    {
        Composite root = new Composite("Фаил");
        root.Add(new Leaf("Открыть"));
        root.Add(new Leaf("Сохранить"));
 
        Composite root2 = new Composite("Сохранить как =>");
 
        root2.Add(new Leaf("  JPG"));
        root2.Add(new Leaf("  PNG"));
 
        root.Add(root2);        
        root.Display();
    }
}
/*
Фаил
Открыть
Сохранить
Сохранить как =>
   JPG
   PNG
*/