摘要:具體檢查方式則是檢查對象是否實現(xiàn)了接口所聲明的所有方法。組合模式將對象群體與組成對象同等對待。裝飾者模式透明地為另一對象提供包裝,實現(xiàn)相同的接口。
Javascript 中模仿接口的三種方法 1. 注釋描述
/* interface Composite { function add(child); function remove(child); function getChild(index); } interface FormItem { function save(); } */ var CompositeForm = function(id, method, action) { // 定義接口類 ... }; // 為接口類添加方法 CompositeForm.prototype.add = function(child) { ... }; CompositeForm.prototype.remove = function(child) { ... }; CompositeForm.prototype.getChild = function(index) { ... }; CompositeForm.prototype.save = function() { ... };
此種方法不易規(guī)范遵守,屬于程序文檔范疇,對接口的約定遵守全靠自覺。但是易于實現(xiàn),不需額外的類或函數(shù)。
2. 屬性檢查/* interface Composite { function add(child); function remove(child); function getChild(index); } interface FormItem { function save(); } */ var CompositeForm = function(id, method, action) { this.implementsInterfaces = ["Composite", "FormItem"]; ... }; ... function addForm(formInstance) { if (!implements(formInstance, "Composite", "FormItem")) { throw new Error("Object does not implement a required interface."); } ... } // 檢查一個對象是否實現(xiàn)了需要的接口 function implements(object) { for (var i = 1; i < arguments.length; i++) { var interfaceName = arguments[i]; var interfaceFound = false; for (var j = 0; j < object.implementsInterfaces.length; j++) { if (object.implementsInterfaces[j] == interfaceName) { interfaceFound = true; break; } } if (!interfaceFound) { return false; // 未找到接口 } } return true; // 所有接口都找到了 }
此方法的優(yōu)點是對類實現(xiàn)的接口提供了文檔說明,如果需要的接口未實現(xiàn)則會報錯。缺點在于不能保證類是否真正實現(xiàn)了接口,只知道它是否說自己實現(xiàn)了接口,即使代碼未將接口實現(xiàn)也能通過檢查,這將在代碼中留下隱患。
3. 鴨式辨型鴨式辨型的意思就是,如果對象具有與接口定義的方法同名的所有方法,那么就認為它實現(xiàn)了這個接口。
// Interfaces var Composite = new Interface("Composite", ["add", "remove", "getChild"]); var FormItem = new Interface("FormItem", ["save"]); // CompositeForm class var CompositeForm = function(id, method, action) { ... }; ... function addForm(formInstance) { // 如果需要的方法未實現(xiàn)則報錯 ensureImplements(formInstance, Composite, FormItem); ... }
ensureImplements函數(shù)至少接受兩個參數(shù),一個是需要檢查的對象,其余為針對此對象需要檢查是否實現(xiàn)的接口。具體檢查方式則是檢查對象是否實現(xiàn)了接口所聲明的所有方法。
此方法的缺點是缺乏其他兩種方法的自我描述性,需要一個輔助類Interface和一個輔助函數(shù)ensureImplements。并且它只關(guān)心方法名稱而不檢查參數(shù)名稱、數(shù)目、類型等。
Interface類綜合第一及第三種接口實現(xiàn)方式,Interface類的定義可以為:
// Constructor var Interface = function(name, methods) { if (arguments.length != 2) { throw new Error("Interface constructor called with " + arguments.length + " arguments, but expected exactly 2."); } this.name = name; this.methods = []; for (var i = 0, len = methods.length; i < len; i++) { if (typeof methods[i] !== "string") { throw new Error("Interface constructor expects method names to be " + " passed in as a string"); } this.methods.push(methods[i]); } }; // Static class method Interface.ensureImplements = function(object) { if (arguments.length < 2) { throw new Error("Function Interface.ensureImplements called with " + arguments.length + " arguments, but expected at least 2."); } for (var i = 1, len = arguments.length; i < len; i++) { var interface = arguments[i]; if (interface.constructor !== Interface) { throw new Error("Function Interface.ensureImplements expects arguments" + "two and above to be instances of Interface."); } for (var j = 0, methodsLen = interface.methods.length; j < methodsLen; j++) { var methods = interface.methods[j]; if (!object[method] || typeof object[method] !== "function") { throw new Error("Function Interface.ensureImplements: object " + "does not implement the " + interface.name + " interface. Method " + method + " was not found."); } } } };依賴接口的設計模式
以下的設計模式依賴接口
1. 工廠模式 保證生產(chǎn)出來的對象實現(xiàn)了必須的方法。
2. 組合模式 將對象群體與組成對象同等對待。
3. 裝飾者模式 透明地為另一對象提供包裝,實現(xiàn)相同的接口。
4. 命令模式 所有的命令對象都實現(xiàn)了同一批方法。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/87513.html
摘要:由于計算機的國際化,組織的標準牽涉到很多其他國家,因此組織決定改名表明其國際性。規(guī)范由萬維網(wǎng)聯(lián)盟制定。級標準級標準是不存在的,級一般指的是最初支持的。 這篇筆記的內(nèi)容對應的是《JavaScript高級程序設計(第三版)》中的第一章。 1.ECMA 和 ECMA-262 ECMA 是歐洲計算機制造商協(xié)會的縮寫,全程是 European Computer Manufacturers Ass...
摘要:與門面模式的聯(lián)系本文要說的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說。我們以中的一個為例,說說實際應用中的適配器模式的使用方法。而如果實現(xiàn)層的問題不大,要解決一部分適配問題的話,適配器模式就是很好的選擇了。 與門面模式的聯(lián)系 本文要說的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說。它們都對類的接口進行了一些改變。門面模式是把相似的或是完成相關(guān)任務的接...
摘要:創(chuàng)建對象中,創(chuàng)建對象的基本模式有三種。因此,在設計構(gòu)造函數(shù)時,需要進行慎重考慮。因此在中,這種問題被稱作繼承破壞封裝。靜態(tài)成員每個只有一份,直接通過類對象進行訪問。 什么是封裝 找工作時一些公司給了offer后我就想知道真正拿到手的是多少,畢竟賦稅繁重。但各種稅也好,五險一金也好我實在是弄不清楚,于是我就會在網(wǎng)上的一些稅后收入計算器上進行計算,只需要填寫一些基本信息,比如稅前收入,所...
摘要:簡單的門面模式實例事件綁定函數(shù)門面模式的作用是將復雜的接口進行包裝,變成一個便于使用的接口。還是以事件相關(guān)為例,事件綁定中還有兩個常用的分別是和。 門面模式是什么,與其我去用笨拙的語言去解釋,不如看下面這張圖,曾經(jīng)在網(wǎng)上很火的一張圖片,說的是一位兒子為他的爸媽設置的電腦桌面。 showImg(http://segmentfault.com/img/bVcgHm); 有了這些起好名字...
摘要:假設有一個生產(chǎn)交通工具的工廠類,它包含生成多種交通工具實例的方法。在使用這個類生產(chǎn)對象的時候,傳入?yún)?shù),在參數(shù)中的屬性規(guī)定我們需要的類型,構(gòu)造函數(shù)就能夠返回我們需要的對象類型了。 一般來說,創(chuàng)建對象的時候我們都習慣使用new關(guān)鍵字來調(diào)用constructor構(gòu)造函數(shù),但使用這種方式會有一些缺點,首先構(gòu)造器函數(shù)的創(chuàng)建本身就是為了模仿其他一些面向?qū)ο笳Z言的特性,有些人覺得這是non-sen...
閱讀 629·2023-04-26 01:53
閱讀 2753·2021-11-17 17:00
閱讀 2888·2021-09-04 16:40
閱讀 1988·2021-09-02 15:41
閱讀 838·2019-08-26 11:34
閱讀 1227·2019-08-26 10:16
閱讀 1338·2019-08-23 17:51
閱讀 820·2019-08-23 16:50