摘要:例如,我有一個父類,定義了一個的接口。設(shè)計模式的一個例子以上是書中的實現(xiàn)方法。可以看到每次在使用前都會做一次接口的遍歷這樣會大大影響效率。所以我把他修改為這種方式實現(xiàn),已達到代碼中給提示的目的來實現(xiàn)接口的個設(shè)計模式。
什么是接口
接口是父類要求子類實現(xiàn)的方法,但是父類并不規(guī)定子類應(yīng)該如何實現(xiàn)。例如,我有一個Person父類,定義了一個job的接口。然后定義一個Student類繼承Person這個父類。他在就一定要定義job這個函數(shù)。
接口之利在面向?qū)ο蟮木幊讨薪涌谟幸欢ǖ淖晕颐枋鲂浴2⒛艽龠M代碼的重用。接口可以告訴要使用他的程序員這個類實現(xiàn)了哪些方法。一個程序員為類寫下了接口,第二個程序員就只要實現(xiàn)了接口,就可以方便大的項目的解耦。也可以實現(xiàn)依賴倒轉(zhuǎn)原則。
接口之弊JS并沒有提供接口的內(nèi)置語法,因為JS是動態(tài)編譯的。其他實現(xiàn)接口的語言如C++,JAVA都是在編譯過程中實現(xiàn)對接口的校驗。JS沒有這個過程,要實現(xiàn)接口的校驗一定會帶來性能上的影響。
《javascript設(shè)計模式》的一個例子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 method = 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."); } } } }; var DynamicMap = new Interface("DynamicMap", ["centerOnPoint", "zoom", "draw"]); function displayRoute(mapInstance) { Interface.ensureImplements(mapInstace, DynamicMap); mapInstance.centerOnPoint(12, 34); mapInstance.zoom(5); mapInstance.draw(); ... }
以上是書中的實現(xiàn)方法。
可以看到每次在使用前都會做一次接口的遍歷這樣會大大影響效率。而且這個有一定的強制性影響了JS代碼的靈活性。我試著做了另一種方法來做到接口的提示作用。并減少強制性。
我的方法var Interface = function (object, 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."); } object[methods[i]] = function () { throw new Error(this.constructor.name + " Interface function is undefined"); }; } }; function Person(name) { this.name = name; this.sayjob = function () { console.log("say"); this.job(); }; this.sayage = function () { console.log("say"); this.age(); }; } function creatPerson(name) { var object = new Person(name); Interface(object, ["job", "age"]); return object; } function Student(name) { this.__proto__ = creatPerson(name); this.job = function () { console.log("job is student"); }; } function creatStudent(name) { var object = new Student(name); return object; } var b = creatStudent("b"); b.job(); //b.age(); b.sayjob(); //b.sayage();總結(jié)
我使用了JS的原型來實現(xiàn),當接口函數(shù)被調(diào)用時候查看按照JS的運行原理當子類沒有實現(xiàn)時候會調(diào)用父類中的方法彈出錯誤并給出提示。我認為接口的主要目的是做限制,不過在JS這種靈活度特別高的語言中,我個人認為這樣的限制影響了性能。也帶損失了靈活性。所以我把他修改為這種方式實現(xiàn),已達到代碼中給提示的目的來實現(xiàn)接口的個設(shè)計模式。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/79323.html
摘要:外觀模式在中常常用于解決瀏覽器兼容性問題。實現(xiàn)外觀模式不僅簡化類中的接口,而且對接口與調(diào)用者也進行了解耦。外觀模式的優(yōu)勢是易于使用,而且本身也比較輕量級。 1. 簡介 外觀模式(Facade)為子系統(tǒng)中的一組接口提供了一個一致的界面,此模塊定義了一個高層接口,這個接口值得這一子系統(tǒng)更加容易使用。外觀模式在JS中常常用于解決瀏覽器兼容性問題。 2. 實現(xiàn) 外觀模式不僅簡化類中的接口,而且...
摘要:工廠模式單例模式結(jié)構(gòu)型設(shè)計模式關(guān)注于如何將類或?qū)ο蠼M合成更大更復(fù)雜的結(jié)構(gòu),以簡化設(shè)計。 一、寫在前面 設(shè)計模式的定義:在面向?qū)ο筌浖O(shè)計過程中針對特定問題的簡潔而優(yōu)雅的解決方案 當然我們可以用一個通俗的說法:設(shè)計模式是解決某個特定場景下對某種問題的解決方案。因此,當我們遇到合適的場景時,我們可能會條件反射一樣自然而然想到符合這種場景的設(shè)計模式。 比如,當系統(tǒng)中某個接口的結(jié)構(gòu)已經(jīng)無法滿足...
摘要:本文主要關(guān)注的是接口測試。所謂接口測試,就是檢查系統(tǒng)提供的接口是否符合事先撰寫的接口文檔。作為接口測試的解決方案,我們必須具備通用性與易用性。 開始 最近幾年,前端測試漸漸被人重視,相關(guān)的框架和方法已經(jīng)比較成熟。斷言庫有should, expect, chai。 單元測試框架有mocha, jasmine, Qunit。 模擬瀏覽器測試環(huán)境有Phantomjs, Slimerjs。 集...
摘要:本文主要關(guān)注的是接口測試。所謂接口測試,就是檢查系統(tǒng)提供的接口是否符合事先撰寫的接口文檔。作為接口測試的解決方案,我們必須具備通用性與易用性。 開始 最近幾年,前端測試漸漸被人重視,相關(guān)的框架和方法已經(jīng)比較成熟。斷言庫有should, expect, chai。 單元測試框架有mocha, jasmine, Qunit。 模擬瀏覽器測試環(huán)境有Phantomjs, Slimerjs。 集...
閱讀 718·2023-04-25 17:54
閱讀 2975·2021-11-18 10:02
閱讀 1137·2021-09-28 09:35
閱讀 654·2021-09-22 15:18
閱讀 2856·2021-09-03 10:49
閱讀 3057·2021-08-10 09:42
閱讀 2579·2019-08-29 16:24
閱讀 1260·2019-08-29 15:08