摘要:例如,我有一個父類,定義了一個的接口。設(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è)計模式》的一個例子</>復(fù)制代碼
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代碼的靈活性。我試著做了另一種方法來做到接口的提示作用。并減少強制性。
我的方法</>復(fù)制代碼
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://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