Софтверски обрасци и компоненте

Структурални обрасци

Проф. др Игор Дејановић (igord на uns ac rs)

Креирано 2025-12-01 Mon 07:31, притисни ESC за мапу, Ctrl+Shift+F за претрагу, "?" за помоћ

Садржај

1. Структурални софтверски обрасци

Баве се удруживањем објеката и класа, коришћењем наслеђивања, композиције и делегације, у циљу формирања сложенијих структура.

2. Adapter

2.1. Adapter

  • Прилагођавамо компоненту чија нам је функционалност потребна али њен интерфејс не одговара нашим захтевима.
  • Нпр. прилагођавање COTS (Commercial Of-The-Shelf) компоненти нашем систему или прилагођавање старих компоненти захтевима новог система.
  • Креирање компоненте тако да је могуће користити у различитим, унапред непознатим, сценаријима.
  • Познат још и као Wrapper.

2.2. Пример

Adapter-concrete.png

2.3. Структура

Adapter-abstract.png

2.4. Две верзије

  • Базиран на класама и наслеђивању – Класа која се адаптира се наслеђује и класа наследница имплементира одговарајући интерфејс.
  • Базиран на објектима и делегацији – Објекту који се адаптира се делегирају позиви од стране адаптер објекта.

2.5. Напомене

  • Количина посла коју адаптер ради варира од обичне конверзије параметара и назива метода до подршке за потпуно другачији сет операција.
  • Измењиви адаптери (Pluggable adapters) – Креирање компоненте тако да се унапред предвиди адаптација објеката са којима треба да сарађује иако унапред објекти и њихове класе нису познати. Пример TreeDisplay.1

2.6. Пример - TreeDisplay

TreeDisplay.png

3. Bridge

3.1. Bridge

Раздвајање абстракције од имплементације тако да се могу независно мењати.

3.2. Пример проблема

Bridge-concreteBad.png

3.3. Примена Bridge обрасца

Bridge-concreteGood.png

3.4. Структура

Bridge-abstract.png

3.5. Када кориситити

  • Када желимо избећи трајно везивање апстракције и имплементације. На пример, ако је потребна измена имплементације у време извршавања апликације.
  • Када желимо да омогућимо независно проширење апстракције и имплементације кроз наслеђивање.
  • Када имамо сложене хијерархије класа као што је показано у примеру.

3.6. Инстанцирање конкретне имплементације

Одлука о инстанцирању конкретне имплементације:

  • Конструктор апстракције путем параметра (ако зна за све имплементације).
  • Делегирање надлежности другом објекту – видети Factory Method - уколико је потребно учинити апстракције несвесне конкретних имплементација.

4. Composite

4.1. Composite

  • Композиција објеката у структуре облика стабла.
  • Униформно третирање простих и сложених објеката.

4.2. Структура обрасца

Composite-Abstract.png

4.3. Пример

Composite-Concrete.png

4.4. Напомена

GOF књига – методе за манипулацију child елементима у Component апстрактној класи.

4.5. Када користити?

  • Ако желите да креирате хијерархије објеката типа целина-део.
  • Желите да клијент може да игнорише разлике између композитних и простих објеката и третира их на униформан начин.

4.6. Демонстрација обрасца Composite на примеру у Јави

5. Decorator

5.1. Decorator

  • Додавање одговорности објекту динамички.
  • Флексибилна алтернатива за наслеђивање.
  • По структури сличан Adapter обрасцу али има другу намену.

5.2. Мотивација

Decorator-ConcreteBad.png

5.3. Пример

Decorator-ConcreteGood.png

5.4. Структура обрасца

Decorator-Abstract.png

5.5. Пример - React Higher-Order Components (HOCs)

function withLogging(WrappedComponent) {
  return function(props) {
    console.log('Rendering:', WrappedComponent.name);
    return <WrappedComponent {...props} />;
  };
}

const EnhancedButton = withLogging(Button);

6. Proxy

6.1. Proxy

  • Посредовање између објекта који пружа сервис и објекта који користи сервис у циљу имплементације контроле приступа, транспарентног приступа удаљеним објектима, AOP техника и сл.
  • Имплементација најчешће делегира позиве метода објекту који пружа
  • Клијент није свестан да постоји посредник између њега и објекта који обезбеђује сервис.
  • Познат и под називом Surrogate.

6.2. Структура обрасца

Proxy-Abstract.png

6.3. Када се користи?

  • Одлагање скупе иницијализације објекта – виртуелни прокси (Virtual Proxy) или лењи прокси (Lazy Proxy).
  • Приступ удаљеном објекту као да је локални (употребом технологија за дистрибуиране објекте - CORBA, DCOM, RMI и сл.) – Remote Proxy.
  • Провера права приступа објекту – Protective Proxy.
  • Синхронизација приступа (проверавање да ли је објекат закључан приликом приступа), бројање референци (smart pointer), имплементацију AOP техника – Smart Proxy.

6.4. Пример - Lazy Proxy

Proxy-Concrete.png

6.5. Copy-On-Write оптимизација

  • Посебна врста лењег или виртуелног проксија.
  • Одлагање копирања сложеног објекта (видети Prototype образац) за тренутак када се затражи операција модификације.
  • Потребно бројање референци: свако креирање новог проксија увећава бројач референци, свако стварно копирање циљног објекта умањује бројач референци. Када бројач референци постане 0 објекат се може уклонити.

6.6. Демонстрација обрасца Proxy на примеру у Јави

7. Литература

  • M. Grand, Patterns in Java: A Catalog of Reusable Design Patterns Illustrated with UML, John Wiley &amp; Sons, Inc., vol. 1, 2002
  • E. Gamma, R. Helm, R. Johnson, and J. M. Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley Professional, 1994