Aktív objektum
Megjelenés
Az aktív objektum tervezési minta a végrehajtást és a metódus hívást szétválasztó minta,[1] 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.[2]
A minta hat elemből áll:[3]
- 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
[szerkesztés]Egy példa az aktív objektum mintáról, Java nyelven.[4]
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)
[szerkesztés]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
[szerkesztés]- ↑ Douglas C. Schmidt. Pattern-Oriented Software Architecture, Volume 2: Patterns for Concurrent and Networked Objects. John Wiley & Sons (2000). ISBN 0-471-60695-2
- ↑ Bass, L., Clements, P., Kazman, R. Software Architecture in Practice. Addison Wesley, 2003
- ↑ Lavender, R. Greg: Active Object (PDF). [2012. szeptember 24-i dátummal az eredetiből archiválva]. (Hozzáférés: 2007. február 2.)
- ↑ Holub, Allen: Java Active Objects - A Proposal. [2013. június 22-i dátummal az eredetiből archiválva]. (Hozzáférés: 2014. június 16.)
További információk
[szerkesztés]Fordítás
[szerkesztés]Ez a szócikk részben vagy egészben az Active object című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.