? ? ? ? 什么是設(shè)計模式?
? ? ? 設(shè)計模式是知道開發(fā)人員按照某種現(xiàn)成的思想組織,編寫代碼的一種程序架構(gòu)方式是一,套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié);
? ? ? 為什么寫程序需要使用設(shè)計模式一般來說 在編寫程序時,不使用任何設(shè)計模式也可以實現(xiàn)各種功能,但是如果使用設(shè)計模式編寫代碼,可以讓代碼執(zhí)行效率,簡潔度,內(nèi)存利用率,程序性能等方面達到最優(yōu);
? ? ? ?例如:使用委托設(shè)計模式給標(biāo)簽添加事件時,只需要給父標(biāo)簽一個添加即可,如果不是用設(shè)計模式,就需要每個標(biāo)簽單獨添加事件,費時費力。
? ? ?第一種設(shè)計模式 ? ?單例設(shè)計模式
? ? ?在程序的生命周期中,每當(dāng)需要使用某個對象時,就調(diào)用一次創(chuàng)建該對象的方法,獲取到這個對象,而該方法只有在第一次被調(diào)用時才會真正創(chuàng)建對象,以后就直接向外返回第一次所創(chuàng)建出來的對象。
? ? ?舉例:
? ? ? ? var Person = (function(){
? ? ? ? ? ? ? ?//用來存儲唯一對象實例的指針變量
? ? ? ? ? ? ?var instance = null;
? ? ? ? ? ? ?return function(age){
? ? ? ? ? ? ? ? ? ? if(instance){
? ? ? ? ? ? ? ? ? ? ? ? ?instance.age = age;
? ? ? ? ? ? ? ? ? ? ? ? return instance;
? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? //第一次調(diào)用new Person()
? ? ? ? ? ? ? ? ? ? this.age = age;
? ? ? ? ? ? ? ? ? ? ?instance = this;
? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? })();
? ? ? ? ? ? ? ? var person1 = new Person(18);
? ? ? ? ? ? ? ?console.log(person1 instanceof ?Person);
? ? ? ? ? ? ? var person2 = new Person(20);
? ? ? ? ? ? ? var person3 = new Person(20);
? ? ? ? ? ? ?console.log(person1 === person2); //true
? ? ? ? ? ? ? console.log(person2 === person3);//true
單例模式的應(yīng)用描述如下:
每個類只有一個實例,這個實例必須通過一個廣為人知的接口,來被客戶訪問。
子類如果要擴展這個唯一的實例,客戶可以不用修改代碼就能使用這個擴展后的實例
第二種設(shè)計模式 ? ?工廠設(shè)計模式
? ? ? ? 工廠設(shè)計模式其實就是另外一種對象創(chuàng)建的模式,但是這種模式并不明確的規(guī)定使用構(gòu)造器,取而代之的是工廠的概念,一個工廠提供一個創(chuàng)建對象的公共接口,我們可以在其中指定我們想要創(chuàng)建對象的類型。
? ? ? ?舉例:
? ? ? ? ? ? ?function factory(name,age){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?var newObj ?= {};
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //var newObj = new Object(); ?這兩種創(chuàng)建對象方式任選一種都可以
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?newObj.name = name;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?newObj.age = age;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? newObj.say ?= function(){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? console.log(this.name);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return newObj;里
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
當(dāng)被應(yīng)用到下面的場景中時,工廠模式特別有用:
當(dāng)我們的對象或者組件設(shè)置涉及到高程度級別的復(fù)雜度時.
當(dāng)我們需要根據(jù)我們所在的環(huán)境方便的生成不同對象的實體時.
當(dāng)我們在許多共享同一個屬性的許多小型對象或組件上工作時.
第三種設(shè)計模式 ? ?代理設(shè)計模式
是把對一個對象的訪問, 交給另一個代理對象來操作,不想直接操作對象,可以通過其他對象來間接控制。
舉一個例子, 我在追一個MM想給她送一束花,但是我因為我性格比較靦腆,所以我托付了MM的一個好朋友來送。
實際的編程中, 這種因為性能問題使用代理模式的機會是非常多的。比如頻繁的訪問dom節(jié)點, 頻繁的請求遠程資源. 可以把操作先存到一個緩沖區(qū), 然后自己選擇真正的觸發(fā)時機.
? ? ? //創(chuàng)建創(chuàng)建對象
var XueWei =function(name){
? ? ? ? ? ? ? ? this.name = name;
? ? ? ? ? ?}
? ? ?//創(chuàng)建班長對象
var monitor = function(xueWei){
? ? ? ? ? ? ? ? ? ?this.xueWei = xueWei;
? ? ? ? ? ? ? ? ? ? //送鉆戒方法
? ? ? ? ? ? ? ? ? ? ?this.sendMarryRing = function(ring){
? ? ? ? ? ? ? ? ?console.log(this.xueWei.name+'這是禮物'+ring)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
//送戒指的代理對象
var ProxyObj = function(xueWei){
? ? ? ? ? ? ? ? ? ? ? this.xueWei = xueWei
? ? ? ? ? ? ? ? ? ? ?//給代理添加送禮物的方法
? ? ? ? ? ? ? ? ?this.sendRing = function (ring){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(new monitor(new XueWei('帆兒'))).sendMarryRing(ring)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ?//創(chuàng)建代理對象
? ? ? ? ? ? ? ? ?var proxy = new ProxyObj(new XueWei('帆兒'));
? ? ? ? ? ? ?proxy.sendRing('婚介')
還有個例子就是在調(diào)用ajax請求的時候,無論是各種開源庫,還是自己寫的Ajax類, 都會給xhr對象設(shè)置一個代理. 我們不可能頻繁的去操作xhr對象發(fā)請求, 而應(yīng)該是這樣.
var request = Ajax.get( ‘cgi.xx.com/xxx’ );
request.send();
request.done(function(){
});
代理模式用處:虛擬代理? ? 為了更好的用戶體驗,我們都會在原圖片未加載完成前,加上loading圖片。
? ? ? ? ? ? ? ? ? ? 合并http請求 ? 要請求的文件放到一塊,等2s一起請求加載
? ? ? ? ? ? ? ? ? ? 緩存代理? 以計算器為例,比如計算某些數(shù)的乘積,當(dāng)參數(shù)重復(fù)時,我們希望不用重復(fù)計算,直接返回 ? ? ? ? ? ? ? ? ? ? ? ? ? ? 結(jié)果
這幾種設(shè)計模式是比較常用的設(shè)計模式,可以在工作中給大大的提高效率,喜歡的朋友多多支持。