Tôi đã thấy mô hình thực hiện theo những cách khác nhau, nhưng ý tưởng rất đơn giản:
- Bạn có một số lớp - giao diện của bạn - mà chỉ đơn giản xác định tên của một số chức năng. (Bạn có thể muốn có một lớp được gọi là Giao diện mà các giao diện thực của bạn khởi tạo, do đó giao diện của bạn có kiểu Giao diện)
- Sau đó, bạn có một số lớp khác triển khai giao diện đó. Điều này có nghĩa rằng lớp thứ hai này phải có ít nhất tất cả các chức năng được chỉ định bởi giao diện.
- Cuối cùng, bạn có một số chức năng khác ở một nơi khác, hy vọng sẽ nhận được một đối tượng thực hiện giao diện. Trong mã mẫu mà bạn đề cập, hàm này là addForm, hàm này hy vọng một đối tượng thực hiện các giao diện 'Composite' và 'FormItem'.
- Hàm này sau đó lặp qua tất cả các phương thức của (các) giao diện mà nó mong đợi và kiểm tra xem đối tượng bạn đã truyền vào nó cũng có các phương thức đó hay không. Nếu một phương thức từ một trong các giao diện không được tìm thấy trong đối tượng được truyền vào hàm, nó xác định đối tượng đó không thực hiện giao diện và ném một ngoại lệ.
Một số người có thể thấy mô hình này không thực tế vì chi phí liên quan, nhưng do thiếu hỗ trợ gốc cho giao diện của Javascript, đây không phải là giải pháp quá tệ. Một số người cũng có thể thấy rằng việc sử dụng giao diện cho các dự án nhỏ trong Javascript là quá mức cần thiết.
Ví dụ
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");
};
};
Cách sử dụng
var myDrawableSurface = new Surface();
// Returns true
InterfaceHelper.ensureImplements(myDrawableSurface, Drawable);
// Returns false (Error thrown)
InterfaceHelper.ensureImplements(myDrawableSurface, Array);
Nguồn
2012-11-01 14:30:11
Điều gì khiến bạn bối rối? Bạn có thể nhận được phản hồi tốt hơn khi đặt câu hỏi cụ thể hơn. –
Tôi thấy rất khó để tìm thấy một thực hiện thực tế này, chủ yếu là làm thế nào để sử dụng nó. Chỉ cần tìm kiếm một mã thực hiện mẫu này. Cảm ơn bạn đã xem xét truy vấn này !! –
@AnmolSaraf Tôi đã thêm vào thực thi es6 cùng mã, vui lòng tham khảo nó. Cú pháp đơn giản hơn để hiểu nếu bạn đến từ nền OOP. –