国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS 設(shè)計模式 一(接口)

stackfing / 3273人閱讀

摘要:例如,我有一個父類,定義了一個的接口。設(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ù)制代碼

  1. var Interface = function(name, methods) {
  2. if(arguments.length != 2) {
  3. throw new Error("Interface constructor called with " + arguments.length + "arguments, but expected exactly 2.");
  4. }
  5. this.name = name;
  6. this.methods = [];
  7. for(var i = 0, len = methods.length; i < len; i++) {
  8. if(typeof methods[i] !== "string") {
  9. throw new Error("Interface constructor expects method names to be " + "passed in as a string.");
  10. }
  11. this.methods.push(methods[i]);
  12. }
  13. };
  14. // Static class method.
  15. Interface.ensureImplements = function(object) {
  16. if(arguments.length < 2) {
  17. throw new Error("Function Interface.ensureImplements called with " +
  18. arguments.length + "arguments, but expected at least 2.");
  19. }
  20. for(var i = 1, len = arguments.length; i < len; i++) {
  21. var interface = arguments[i];
  22. if(interface.constructor !== Interface) {
  23. throw new Error("Function Interface.ensureImplements expects arguments " + "two and above to be instances of Interface.");
  24. }
  25. for(var j = 0, methodsLen = interface.methods.length; j < methodsLen; j++) {
  26. var method = interface.methods[j];
  27. if(!object[method] || typeof object[method] !== "function") {
  28. throw new Error("Function Interface.ensureImplements: object " + "does not implement the " + interface.name + " interface. Method " + method + " was not found.");
  29. }
  30. }
  31. }
  32. };
  33. var DynamicMap = new Interface("DynamicMap", ["centerOnPoint", "zoom", "draw"]);
  34. function displayRoute(mapInstance) {
  35. Interface.ensureImplements(mapInstace, DynamicMap);
  36. mapInstance.centerOnPoint(12, 34);
  37. mapInstance.zoom(5);
  38. mapInstance.draw();
  39. ...
  40. }

以上是書中的實現(xiàn)方法。

可以看到每次在使用前都會做一次接口的遍歷這樣會大大影響效率。而且這個有一定的強制性影響了JS代碼的靈活性。我試著做了另一種方法來做到接口的提示作用。并減少強制性。

我的方法

</>復(fù)制代碼

  1. var Interface = function (object, methods) {
  2. for (var i = 0, len = methods.length; i < len; i++) {
  3. if (typeof methods[i] !== "string") {
  4. throw new Error("Interface constructor expects method names to be passed in as a string.");
  5. }
  6. object[methods[i]] = function () {
  7. throw new Error(this.constructor.name + " Interface function is undefined");
  8. };
  9. }
  10. };
  11. function Person(name) {
  12. this.name = name;
  13. this.sayjob = function () {
  14. console.log("say");
  15. this.job();
  16. };
  17. this.sayage = function () {
  18. console.log("say");
  19. this.age();
  20. };
  21. }
  22. function creatPerson(name) {
  23. var object = new Person(name);
  24. Interface(object, ["job", "age"]);
  25. return object;
  26. }
  27. function Student(name) {
  28. this.__proto__ = creatPerson(name);
  29. this.job = function () {
  30. console.log("job is student");
  31. };
  32. }
  33. function creatStudent(name) {
  34. var object = new Student(name);
  35. return object;
  36. }
  37. var b = creatStudent("b");
  38. b.job();
  39. //b.age();
  40. b.sayjob();
  41. //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

相關(guān)文章

  • 接口

    摘要:前言這一系列的文章將主要基于設(shè)計模式這本書的要點還有一些翻閱的博客文章借鑒來源會注明外加自己的一些與直覺不同于其他設(shè)計模式類的書設(shè)計模式是一本講述設(shè)計模式在動態(tài)語言中的實現(xiàn)的書它從設(shè)計的角度教人編寫代碼書中的許多實例代碼來自實戰(zhàn)項目對面向?qū)? 前言 這一系列的文章將主要基于js設(shè)計模式這本書的要點還有一些翻閱的博客文章,借鑒來源會注明,外加自己的一些demo與直覺.不同于其他設(shè)計模式類的...

    zhjx922 評論0 收藏0
  • JS 外觀模式

    摘要:外觀模式在中常常用于解決瀏覽器兼容性問題。實現(xiàn)外觀模式不僅簡化類中的接口,而且對接口與調(diào)用者也進行了解耦。外觀模式的優(yōu)勢是易于使用,而且本身也比較輕量級。 1. 簡介 外觀模式(Facade)為子系統(tǒng)中的一組接口提供了一個一致的界面,此模塊定義了一個高層接口,這個接口值得這一子系統(tǒng)更加容易使用。外觀模式在JS中常常用于解決瀏覽器兼容性問題。 2. 實現(xiàn) 外觀模式不僅簡化類中的接口,而且...

    BothEyes1993 評論0 收藏0
  • JS設(shè)計模式學(xué)習(xí)_基礎(chǔ)篇

    摘要:工廠模式單例模式結(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)無法滿足...

    venmos 評論0 收藏0
  • 關(guān)于前端接口測試的探索和挖坑

    摘要:本文主要關(guān)注的是接口測試。所謂接口測試,就是檢查系統(tǒng)提供的接口是否符合事先撰寫的接口文檔。作為接口測試的解決方案,我們必須具備通用性與易用性。 開始 最近幾年,前端測試漸漸被人重視,相關(guān)的框架和方法已經(jīng)比較成熟。斷言庫有should, expect, chai。 單元測試框架有mocha, jasmine, Qunit。 模擬瀏覽器測試環(huán)境有Phantomjs, Slimerjs。 集...

    Crazy_Coder 評論0 收藏0
  • 關(guān)于前端接口測試的探索和挖坑

    摘要:本文主要關(guān)注的是接口測試。所謂接口測試,就是檢查系統(tǒng)提供的接口是否符合事先撰寫的接口文檔。作為接口測試的解決方案,我們必須具備通用性與易用性。 開始 最近幾年,前端測試漸漸被人重視,相關(guān)的框架和方法已經(jīng)比較成熟。斷言庫有should, expect, chai。 單元測試框架有mocha, jasmine, Qunit。 模擬瀏覽器測試環(huán)境有Phantomjs, Slimerjs。 集...

    zxhaaa 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<