Активний об'єкт (англ. Active object) — шаблон проектування, який відокремлює виконання методу від виклику методу для об'єктів, кожен з яких знаходиться у власному потоці керування. Мета полягає в тому, щоб запровадити паралелізм за допомогою асинхронного виклику методів і планувальника для обробки запитів.
Шаблон складається з шести елементів:
- Об'єкт-замісник (проксі), який забезпечує інтерфейс для клієнтів із загальнодоступними методами.
- Інтерфейс, який визначає методу доступу до активного об'єкта.
- Список поступаючих запитів від клієнтів.
- Планувальник, який вирішує, який запит виконати наступним.
- Реалізація методів активного об'єкта.
- Процедура зворотного виклику або змінна для отримання клієнтом результату.
Приклад
Java
Приклад шаблону активного об'єкта в Java .
Далі наведено стандартний клас, який надає два методи, кожен з яких встановлює певне значення типу double для змінної val
. Цей клас НЕ відповідає шаблону активного об’єкта.
class MyClass { private double val = 0.0; void doSomething() { val = 1.0; } void doSomethingElse() { val = 2.0; } }
Клас є небезпечним у багатопоточному сценарії, оскільки обидва методи можуть бути викликані одночасно, тому значення val може бути невизначеним — це класична умова гонки. Можна використовувати синхронізацію для вирішення цієї проблеми, що в цьому тривіальному випадку легко. Але як тільки клас стає складним, синхронізація може стати дуже складною.
Для того, щоб переписати цей клас саме як активний об’єкт, можна зробити наступне:
class MyActiveObject { private double val = 0.0; private BlockingQueue<Runnable> dispatchQueue = new LinkedBlockingQueue<Runnable>(); public MyActiveObject() { new Thread (new Runnable() { @Override public void run() { try { while (true) { dispatchQueue.take().run(); } } catch (InterruptedException e) { // ok, перервати диспетчер } } } ).start(); } void doSomething() throws InterruptedException { dispatchQueue.put(new Runnable() { @Override public void run() { val = 1.0; } } ); } void doSomethingElse() throws InterruptedException { dispatchQueue.put(new Runnable() { @Override public void run() { val = 2.0; } } ); } }
Див. також
Примітки
- ; Michael Stal; Hans Rohnert; Frank Buschmann (2000). Pattern-Oriented Software Architecture, Volume 2: Patterns for Concurrent and Networked Objects. John Wiley & Sons. ISBN .
- Bass, L., Clements, P., Kazman, R. Software Architecture in Practice. Addison Wesley, 2003
- Lavender, R. Greg; Schmidt, Douglas C. (PDF). Архів оригіналу (PDF) за 22 липня 2012. Процитовано 2 лютого 2007.
- Holub, Allen. . Архів оригіналу за 22 червня 2013. Процитовано 16 червня 2014.
Посилання
- Ultra-high performance middleware based on Disruptor Active Object in C++14
- Active Object implementation in C++11
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Aktivnij ob yekt angl Active object shablon proektuvannya yakij vidokremlyuye vikonannya metodu vid vikliku metodu dlya ob yektiv kozhen z yakih znahoditsya u vlasnomu potoci keruvannya Meta polyagaye v tomu shob zaprovaditi paralelizm za dopomogoyu asinhronnogo vikliku metodiv i planuvalnika dlya obrobki zapitiv Shablon skladayetsya z shesti elementiv Ob yekt zamisnik proksi yakij zabezpechuye interfejs dlya kliyentiv iz zagalnodostupnimi metodami Interfejs yakij viznachaye metodu dostupu do aktivnogo ob yekta Spisok postupayuchih zapitiv vid kliyentiv Planuvalnik yakij virishuye yakij zapit vikonati nastupnim Realizaciya metodiv aktivnogo ob yekta Procedura zvorotnogo vikliku abo zminna dlya otrimannya kliyentom rezultatu PrikladJava Priklad shablonu aktivnogo ob yekta v Java Dali navedeno standartnij klas yakij nadaye dva metodi kozhen z yakih vstanovlyuye pevne znachennya tipu double dlya zminnoyi val Cej klas NE vidpovidaye shablonu aktivnogo ob yekta class MyClass private double val 0 0 void doSomething val 1 0 void doSomethingElse val 2 0 Klas ye nebezpechnim u bagatopotochnomu scenariyi oskilki obidva metodi mozhut buti viklikani odnochasno tomu znachennya val mozhe buti neviznachenim ce klasichna umova gonki Mozhna vikoristovuvati sinhronizaciyu dlya virishennya ciyeyi problemi sho v comu trivialnomu vipadku legko Ale yak tilki klas staye skladnim sinhronizaciya mozhe stati duzhe skladnoyu Dlya togo shob perepisati cej klas same yak aktivnij ob yekt mozhna zrobiti nastupne class MyActiveObject private double val 0 0 private BlockingQueue lt Runnable gt dispatchQueue new LinkedBlockingQueue lt Runnable gt public MyActiveObject new Thread new Runnable Override public void run try while true dispatchQueue take run catch InterruptedException e ok perervati dispetcher start void doSomething throws InterruptedException dispatchQueue put new Runnable Override public void run val 1 0 void doSomethingElse throws InterruptedException dispatchQueue put new Runnable Override public void run val 2 0 Div takozhModel aktorivPrimitki Michael Stal Hans Rohnert Frank Buschmann 2000 Pattern Oriented Software Architecture Volume 2 Patterns for Concurrent and Networked Objects John Wiley amp Sons ISBN 0 471 60695 2 Bass L Clements P Kazman R Software Architecture in Practice Addison Wesley 2003 Lavender R Greg Schmidt Douglas C PDF Arhiv originalu PDF za 22 lipnya 2012 Procitovano 2 lyutogo 2007 Holub Allen Arhiv originalu za 22 chervnya 2013 Procitovano 16 chervnya 2014 PosilannyaUltra high performance middleware based on Disruptor Active Object in C 14 Active Object implementation in C 11