Widziałem wzór realizowane na różne sposoby, ale idea jest prosta:
- Masz jakąś klasę - interfejs - to po prostu Określa nazwy niektórych funkcji. (Możesz chcieć mieć klasę o nazwie Interface, którą Twoi rzeczywiste interfejsy tworzą, tak, żeby twoje interfejsy były typu Interface).
- Następnie masz inną klasę, która implementuje taki interfejs. Oznacza to, że ta druga klasa musi mieć co najmniej wszystkie funkcje określone przez interfejs.
- Wreszcie, masz inną funkcję gdzieś indziej, która oczekuje na otrzymanie obiektu implementującego interfejs. W przykładowym kodzie, o którym wspomniałeś, ta funkcja to addForm, która oczekuje obiektu implementującego interfejs "Composite" i "FormItem".
- Ta funkcja następnie przeplata wszystkie metody interfejsu (ów), których oczekuje, i sprawdza, czy obiekt, który do niego przekazałeś, również posiada te metody. Jeśli nie znaleziono metody z jednego z interfejsów w obiekcie przekazanym do funkcji, oznacza to, że obiekt nie implementuje interfejsu i zgłasza wyjątek.
Niektóre osoby mogą uznać ten wzór za niepraktyczny ze względu na związane z nim koszty, ale biorąc pod uwagę brak naturalnej obsługi interfejsów przez Javascript, nie jest to zbyt złe rozwiązanie. Niektóre osoby mogą również stwierdzić, że używanie interfejsów dla małych projektów w JavaScript jest przesadzone.
Przykład
var Interface = function(name, methods) {
this.name = name;
this.methods = [];
if (methods.constructor == Array)
this.methods = methods;
else if (methods.constructor == String)
this.methods[0] = methods;
else
throw new Error("Interface must define methods as a String or an Array of Strings");
};
var InterfaceHelper = {
ensureImplements : function(obj, interfaces) {
// If interfaces is not an array, assume it's a function pointer
var toImplement = interfaces.constructor == Array ? interfaces : [interfaces];
var interface;
// For every interface that obj must implement:
for (var i = 0, len = toImplement.length; i < len; i++) {
interface = toImplement[i];
// Make sure it indeed is an interface
if (interface.constructor != Interface)
throw new Error("Object trying to implement a non-interface. "
+ interface.name + " is not an Interface.");
// Make sure obj has all of the methods described in the interface
for (var j = 0, interfaceLen = interface.methods.length; j < interfaceLen; j++)
if (!obj[interface.methods[j]])
throw new Error("Interface method not implemented. "
+ interface.name + " defines method " + interface.methods[j]);
}
return true;
}
};
var Drawable = new Interface("Drawable", ["onDraw"]);
var Surface = function() {
this.implements = ["Drawable"];
this.onDraw = function() {
console.log("Surface Drawing");
};
};
Zastosowanie
var myDrawableSurface = new Surface();
// Returns true
InterfaceHelper.ensureImplements(myDrawableSurface, Drawable);
// Returns false (Error thrown)
InterfaceHelper.ensureImplements(myDrawableSurface, Array);
Co Cię martwi? Możesz uzyskać lepszą odpowiedź, zadając bardziej szczegółowe pytanie. –
Mam trudności ze znalezieniem praktycznej realizacji tego, głównie z tego, jak z niego korzystać. Po prostu szukam kodu, który implementuje ten wzorzec. Dzięki za zaglądanie w to zapytanie !! –
@AnmolSaraf Dodałem implementację es6 tego samego kodu, zapoznaj się z nim. Składnia jest łatwiejsza do zrozumienia, jeśli pochodzisz z tła OOP. –