callback oder observer
-
der Zweck von callback ist das Informieren der Veränderung im unterliegenden Layer nach Oben.
Das kann ich auch mit Observer realisieren:
Observer Interface:#ifndef _COBSERVER_H_ #define _COBSERVER_H_ class CObserver { public: virtual void someChangesInUnderLayer(const std::string& inText) = 0; }; #endifunder layer:
#ifndef _CUNDERLAYER_H_ #define _CUNDERLAYER_H_ #include <iostream> #include <string> #include "CObserver.hxx" class CUnderLayer { public: CUnderLayer(CObserver* inObserver) { ob = inObserver; } void changeIt() { std::cout<<"called by UpperLayer: NO PROBLEM"<<std::endl; doSomething(); ob->someChangesInUnderLayer(internalStr); } private: void doSomething() { internalStr = "Dosomething in UnderLayer"; }; CObserver *ob; std::string internalStr; }; #endifober layer
#ifndef _CUPPERLAYER_H_ #define _CUPPERLAYER_H_ #include "CUnderLayer.hxx" class CUpperLayer : public CObserver { public: void someChangesInUnderLayer(const std::string& inText) { std::cout<<"What is in UnterLayer changed : "<< inText<<std::endl; } }; #endifmain
#include "CUnderLayer.hxx" #include "CUpperLayer.hxx" int main() { CUnderLayer under(new CUpperLayer()); under.changeIt(); return 0; }Nun was ist der Unterschied zwischen callback und observer?
-
Das Callback ist die blanke C Version ...
Der Observer, und damit nen polymorphes Object, polymorphes Object -> vtable, vtable -> Funktionspointer (tabelle) ....
Ist einfach die objectorientierte auf C++ zugeschnittene Version davon ^^wenn dein compiler einigermassen clever (optimierung) und nicht mehr viel hinzukommt, ist ne implementierung mit funktionspointer (callback) und ner einfachen Observer variante im generierten maschinencode gar nicht so unterschiedlich.
Wenn C++ nimmst und damit soweiso auf objektorientierung und Designpattern stehst nimmst Observer klar.
wenn das selbe in c machen musst (oder ne C Schnittstelle bauen musst), keine untzerstuetzung von objecten von der programmiersprache, musst es selber per hand implementieren -> callback.
Ciao ...