Az aktív objektum tervezési minta a végrehajtást és a metódus hívást szétválasztó minta, aminek célja, hogy kiküszöbölje az objektumokkal járó önvezérlési hibákat, valamint, hogy segítse a kommunikáció során az asszinkron metódusmeghívást és ütemezze a beérkező kéréseket.Bass, L., Clements, P., Kazman, R. Software Architecture in Practice. Addison Wesley, 2003
A minta hat elemből áll:
A proxyból, ami biztosítja az interfészeket a felhasználók felé, nyilvánosan hozzáférhető metódusokkal. Az interfészből, amelyik leírja, hogy az aktív objektum mely metódusai hívhatók. A felhasználók függőben lévő kérelmeinek a listájából. Az ütemezőből, amelyik dönt, hogy legközelebb melyik kérelmet hajtsa végre. A kivitelezőből, ami végrehajtja az aktív objektum metódust. A változóból, amiből a felhasználók/ügyfelek kiolvashatják az eredményt.
Példa Egy példa az aktív objektum mintáról, Java nyelven.
class OriginalClass { private double val = 0.0;
// void doSomething()
val = 1.0;
// void doSomethingElse()
val = 2.0;
class BecomeActiveObject { private double val = 0.0; private BlockingQueue<Runnable> dispatchQueue = new LinkedBlockingQueue<Runnable>();
// public BecomeActiveObject()
new Thread( new Runnable()
@Override public void run()
while (true)
try
dispatchQueue.take().run(); } catch (InterruptedException e) { // okay, just terminate the dispatcher
).start();
// void doSomething() throws InterruptedException
dispatchQueue.put( new Runnable()
public void run() { val = 1.0; }
);
// void doSomethingElse() throws InterruptedException
dispatchQueue.put( new Runnable()
public void run() { val = 2.0; }
);
Java (alternatív) Egy másik példa, szintén Java nyelven. public class AnotherActiveObject { private double val;
// container for tasks // decides which request to execute next // asyncMode=true means our worker thread processes its local task queue in the FIFO order // only single thread may modify internal state private final ForkJoinPool fj = new ForkJoinPool(1, ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
// implementation of active object method public void doSomething() throws InterruptedException { fj.execute(new Runnable() { @Override public void run() { val = 1.0;
});
// implementation of active object method public void doSomethingElse() throws InterruptedException { fj.execute(new Runnable() { @Override public void run() { val = 2.0;
});
Jegyzetek
További információk Active Object implementation in C++11
Fordítás
Kategória:Programtervezési minták Kategória:Java-kódpéldák