Hierarchical View Pattern

Környezet

A Relational Database Access Layer használata, a logikai és a fizikai réteg szétválasztása.

Probléma

Milyen interfészt kell az adatbázisnak az alkalmazás felé mutatnia?

Befolyásoló tényezők

A tervezésnél és a megvalósításnál az alábbi döntéseket kell hozni.

Megoldás

  1. Induljunk ki a relációs adatmodellből! Egy entitástól elindulva idegen kulcsok mentén navigáljunk! A navigáció során egy aciklikus irányított gráfot építsünk, amelyet címkézzünk fel!
  2. Az aciklikus irányított gráf minden csúcsához rendeljünk egy osztályt!
  3. Használjunk aggregációt az egy-egy típusú kapcsolatoknál, és konténert az egy-sok típusú kapcsolatoknál.

Példa

A korábban elkezdett példa osztályszerkezetének megvalósítása a gráf alapján az alábbiak szerint fog kinézni.

struct Customer {
    CustomerKeyType iCustNumber;
};
struct Article {
    ArticleNumberType iArticleNumber;
};
struct OrderItem {
    Article iArticle;
    QuantityType iQuantity;
};

classOrderInvoiceView : public HierarchicalView {
  public:
    OrderInvoiceView(OrderKeyType anOrder);

    OrderKeyType iOrder;
    Customer iCustomer;
    Vector<OrderItem> iTems;
    Money iSumOfInvoice;
  protected:
    virtual void update(void);
    virtual void insert(void);
    virtual void remove(void);
    virtual void read(void);
};
Ezek után a kód mentes lesz adatbázisfüggő dolgoktól, és a logikai adatmodellt követi.
void Order::processInvoice(OrderKeyType anOrder) {
    OrderInvoiceView *pInvoice = 
       (OrderInvoiceView) ViewFactory::getView(anOrder);

    ItemIterator itemIter = pInvoice->iItems.begin();
    for(;itemIter != iItems.end(); itemIter++) {
        pInvoice->iSumOfInvoice+=
            (itemIter->iQuantity *
	     itemIter->iArticle.iArticlePrice);
    }
    pInvoice->markModified();
}

Következmények

Variációk

A minta környezetében minden elhagyható. Ez azonban csak egyszerűbb alkalmazásnál igaz.