摘要:本回內(nèi)容介紹上一回聊到單例模式,做了一道題,內(nèi)容不多,比較容易理解。這里其實(shí)還可以進(jìn)一步優(yōu)化,達(dá)到高聚類低耦合,這里工廠模式就告一段落了。
本回內(nèi)容介紹
上一回聊到JS單例模式(singleton),做了一道題,內(nèi)容不多,比較容易理解。
介一回嘞,聊聊工廠模式,之前聊到過工廠模式,這回聊深入點(diǎn)兒,可能會(huì)比較抽象,不過好在實(shí)際開發(fā)中使用還算廣泛,理解起來會(huì)比較容易,開始咯:
比如我們創(chuàng)建一個(gè)會(huì)員系統(tǒng),有會(huì)員和管理員兩種角色,每種角色有登錄,注銷的功能,
這里需要引入之前講過的接口類,如下:
// 用戶類 function User(){}; // 用戶工廠模式 User.prototype = { // 還原構(gòu)造器,指向User constructor:User, // 創(chuàng)建用戶的方法,傳入的type是用戶類型 createUser:function(type){ // 這里建一個(gè)變量,用于返回實(shí)例 var user; // 判斷傳入的用戶類型,返回該類型的實(shí)例 switch(type){ case "Member":user = new Member();break; case "Admin" :user = new Admin();break; }; // 這里之前講過的,檢測(cè)接口 Interface.ensureImplements(user,UserInterface) return user; } } // 創(chuàng)建一個(gè)用戶接口,而且必須實(shí)現(xiàn)該接口的login,logout兩個(gè)方法 var UserInterface = new Interface("UserInterface",["login","logout"]); // 會(huì)員類,包括實(shí)現(xiàn)的接口方法 function Member(){} Member.prototype.login = function(){alert("會(huì)員登錄");} Member.prototype.logout = function(){alert("會(huì)員注銷");} // 管理員類,包括實(shí)現(xiàn)的接口方法 function Admin(){} Admin.prototype.login = function(){alert("管理員登錄");} Admin.prototype.logout = function(){alert("管理員注銷");} // new一個(gè)用戶工廠 var o = new User(); // 創(chuàng)建一個(gè)管理員 var a = o.createUser("Admin"); // 調(diào)用login方法 a.login(); // 下面一堆是會(huì)員的實(shí)現(xiàn),不用多說了吧 var o2 = new User(); var m = o.createUser("Member"); m.logout();
這就是一個(gè)簡(jiǎn)單工廠模式實(shí)現(xiàn)了,應(yīng)該很多盆友已經(jīng)看出來了,同樣的方法要實(shí)現(xiàn)兩次,好像有點(diǎn)冗余了吧,那么就可以用到之前的繼承了,改吧改吧,帥狐show time:
2. 簡(jiǎn)單工廠之解耦這里要用到之前寫的繼承類了,寫一個(gè)用戶基類,還要考慮到每個(gè)用戶和管理員分別有不同的權(quán)限,那么我們可以再做一次工廠解耦,細(xì)化粒度,如下:
function User(){}; User.prototype = { constructor:User, // 給用戶配置權(quán)限,type是用戶類型 assignRole:function(type){ // 創(chuàng)建用戶,這里還可以做很多擴(kuò)展,這里先留... var user = UserFactory.createUser(type); return user; } } // 創(chuàng)建用戶的工廠(還記的上一回的單例模式嗎,這也是個(gè)單例模式喲) var UserFactory = { // 這里為了解耦,跟上面的代碼對(duì)比一下,換了個(gè)位置 createUser:function(type){ var user; switch(type){ case "Member":user = new Member();break; case "Admin" :user = new Admin();break; }; Interface.ensureImplements(user,UserInterface) return user; } } var UserInterface = new Interface("UserInterface",["login","logout"]); // User的基類,如果有疑惑,看看之前講的繼承 function BaseUser(){}; BaseUser.prototype = { constructor:BaseUser, login:function(){ alert(this.constructor.name + " 登錄"); }, logout:function(){ alert(this.constructor.name + " 注銷"); } } // 用戶類,繼承基類,這樣就有了兩個(gè)方法 function Member(){} extend(Member,BaseUser); // 管理員類,這樣就避免了重復(fù)創(chuàng)建的冗余 function Admin(){} extend(Admin,BaseUser); // 這里沒什么好說的,實(shí)例測(cè)試 var o = new User(); var a = o.assignRole("Admin"); a.login(); var o2 = new User(); var m = o.assignRole("Member"); m.logout();
這個(gè)例子稍微開始有點(diǎn)復(fù)雜了,結(jié)合了之前聊的接口,繼承,單例等,在配置權(quán)限的地方其實(shí)還可以做很多擴(kuò)展,比如:
有會(huì)員有不同等級(jí)的會(huì)員,管理有不同等級(jí)的管理員,不同的級(jí)別存在不同的方法,要做到這樣的話,我們可以通過抽象類,讓每個(gè)類覆蓋方法,動(dòng)態(tài)的創(chuàng)建工廠,來吧,繼續(xù)帥狐show time:
不同的用戶組有不同的角色,不同的角色擁有不同的權(quán)限,如下:
function User(){}; User.prototype = { constructor:User, // 這里是個(gè)抽象方法,每個(gè)類可以根據(jù)不同的需求來重載 assignRole:function(type){ // 調(diào)用自身的抽象方法,意義是在無重載的時(shí)候執(zhí)行 this.abs(type); }, // 這里是在無重載的時(shí)候執(zhí)行 abs:function(){ throw new Error("the abstract class can override the virtual method with an abstract method."); } }; // 多帶帶定義Member組 function MemberGroup(){} extend(MemberGroup,User); MemberGroup.prototype = { constructor:MemberGroup, // 分配權(quán)限方法,根據(jù)傳入的角色來創(chuàng)建不同的實(shí)例 assignRole:function(type){ var role; // 這里定義兩個(gè)角色,會(huì)員和高級(jí)會(huì)員 var group = ["Member","SeniorMember"]; // indexOf眼熟吧,第一回的時(shí)候聊過的ES5的新玩意 if(group.indexOf(type)>-1){ // 調(diào)用用戶工廠的創(chuàng)建用戶方法 role = UserFactory.createUser(type); }else{ alert("無該"+type+"角色!"); } return role; } } // 跟上面一樣,這里定義Admin function AdminGroup(){} extend(AdminGroup,User); AdminGroup.prototype = { constructor:AdminGroup, assignRole:function(type){ var role; // 這里定義兩個(gè)角色,管理員和高級(jí)管理員 var group = ["Admin","SeniorAdmin"]; if(group.indexOf(type)>-1){ role = UserFactory.createUser(type); }else{ alert("無該"+type+"角色!"); } return role; } } // 創(chuàng)建用戶的工廠(跟上一個(gè)例子一樣,只是這里是動(dòng)態(tài)創(chuàng)建工廠) var UserFactory = { createUser:function(type){ // eval()直接執(zhí)行 var user = eval("new "+type+"()"); Interface.ensureImplements(user,UserInterface) return user; } } var UserInterface = new Interface("UserInterface",["login","logout"]); // User的基類,如果有疑惑,看看之前講的繼承 function BaseUser(){}; BaseUser.prototype = { constructor:BaseUser, login:function(){ alert(this.constructor.name + " 登錄"); }, logout:function(){ alert(this.constructor.name + " 注銷"); } } // 會(huì)員類,繼承基類,這樣就有了兩個(gè)方法 function Member(){} extend(Member,BaseUser); // 高級(jí)會(huì)員類,有自己特有的高級(jí)方法 function SeniorMember(){} extend(SeniorMember,BaseUser); SeniorMember.prototype.seniorM = function(){alert("高級(jí)會(huì)員的權(quán)限")}; // 管理員類,這樣就避免了重復(fù)創(chuàng)建的冗余 function Admin(){} extend(Admin,BaseUser); // 高級(jí)管理員類,有自己特有的高級(jí)方法 function SeniorAdmin(){} extend(SeniorAdmin,BaseUser); SeniorAdmin.prototype.seniorA = function(){alert("高級(jí)管理員的權(quán)限")}; // 這里其實(shí)可以回憶一下裝飾者模式,把高級(jí)管理員的實(shí)例做一次包裝 var obj = new SeniorAdmin(); // 超級(jí)管理員類,裝飾高級(jí)管理員的實(shí)例 function SuperAdmin(obj){} SuperAdmin.prototype.superA = function(){ obj.seniorA(); alert("再?gòu)椧粋€(gè)窗,特效,特效,加特效!因?yàn)槲沂浅?jí)管理員!喲呼~~"); }; // 這里沒什么好說的,實(shí)例測(cè)試 var o = new MemberGroup(); var a = o.assignRole("SeniorMember"); a.seniorM(); var o2 = new AdminGroup(); var m = o2.assignRole("SeniorAdmin"); m.seniorA(); var o3 = new SuperAdmin(obj); o3.superA();
這個(gè)例子有點(diǎn)略復(fù)雜,在上一個(gè)例子的基礎(chǔ)上做了抽象類,還復(fù)習(xí)了裝飾者模式,如果感覺暈菜,可以跳過。
這里其實(shí)還可以進(jìn)一步優(yōu)化,達(dá)到高聚類低耦合,這里工廠模式就告一段落了。
裝個(gè)逼先。今天看優(yōu)酷放出了新版嘻哈四重奏,一看沒有了原版人馬,就算是笑點(diǎn)也笑不起來了,算了換一個(gè)劇看,啊呃~~
題目:快速排序這一回聊的內(nèi)容比較繞腦袋,反正感覺暈菜的話就啟動(dòng)囫圇吞棗模式,想不通的先停下,以后再回過來看或許就恍然大悟,
下面的內(nèi)容,跟上一回一樣,就一道題好了。
這個(gè)快速排序比較基礎(chǔ),網(wǎng)上很多,這里我就把注釋寫清楚一點(diǎn),方便大家理解:
var arr = [12,5,36,6,22,66]; // 快速排序 function quickSort(arr){ // 判斷數(shù)組長(zhǎng)度,只有小等于1的時(shí)候返回 if(arr.length<=1){ return arr; } // 向下取整,也就是取一半的長(zhǎng)度 var num = Math.floor(arr.length/2); // 取中間的那個(gè)數(shù) var numValue = arr.splice(num,1); // 定義兩個(gè)數(shù)組做容器 var left = []; var right = []; // 循環(huán)數(shù)組 for(var i=0;i網(wǎng)上找的例子,注釋寫的還算清楚吧,難度不大,跟上一回一樣,當(dāng)娛樂消遣。
這一回,主要聊了工廠模式,并且將前面的內(nèi)容融合了進(jìn)去,復(fù)習(xí)了繼承,接口,單例模式,裝飾者模式,涉及了一些簡(jiǎn)單的業(yè)務(wù)邏輯,對(duì)于剛接觸面向?qū)ο螅O(shè)計(jì)模式的童鞋稍微有點(diǎn)難度~~
下一回,就聊用的比較頻繁的一個(gè)設(shè)計(jì)模式,門面模式。客觀看完點(diǎn)個(gè)贊,推薦推薦唄,嘿嘿~~
注:此系飛狐原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/86151.html
本回內(nèi)容介紹 上一回聊到JS中模擬接口,裝飾者模式,摻元類,分析了backbone的繼承源碼,感覺還好吧! 介一回,偶們來聊一下在JS單例模式(singleton),單例模式其實(shí)運(yùn)用很廣泛,比如:jquery,AngularJS,underscore吖蝦米的都是單例模式,來吧,直接開始咯: 1. 單例模式 保證一個(gè)類只有一個(gè)實(shí)例,從全局命名空間里提供一個(gè)唯一的訪問點(diǎn)來訪問該對(duì)象。其實(shí)之前寫過的對(duì)象...
摘要:本回內(nèi)容介紹上一回聊到數(shù)據(jù)類型,簡(jiǎn)單的過了一遍,包括個(gè)數(shù)組新特性等,這一回來聊聊對(duì)象,結(jié)合數(shù)組來實(shí)戰(zhàn)一些例子,在做題中成長(zhǎng),記憶會(huì)更深刻,來吧,開始咯創(chuàng)建實(shí)例的方式有兩種使用操作符后跟構(gòu)造函數(shù)飛狐使用對(duì)象字面量表示法飛狐也可以飛狐這種寫法與 本回內(nèi)容介紹 上一回聊到JS數(shù)據(jù)類型,簡(jiǎn)單的過了一遍,包括9個(gè)數(shù)組新特性等,這一回來聊聊Object對(duì)象,結(jié)合數(shù)組來實(shí)戰(zhàn)一些例子,在做題中成長(zhǎng),記...
摘要:橋接模式之特權(quán)函數(shù)特權(quán)函數(shù),用一些具有特權(quán)的方法作為橋梁以便訪問私有空間,可以回憶一下之前的系列。連續(xù)自然數(shù)分組,計(jì)算最多組的個(gè)數(shù)將至這個(gè)連續(xù)自然數(shù)分成組使每組相加的值相等。個(gè)數(shù)組中數(shù)字最多的一組有個(gè)此時(shí)的和為。 本回內(nèi)容介紹 上一回,聊了適配器模式,圖片預(yù)加載,介一回,聊橋接模式(Bridge),跟之前一樣,難度比較小,橋接模式將抽象部分與它的實(shí)現(xiàn)部分分離,通過橋接模式聯(lián)系彼此,同時(shí)...
摘要:本回內(nèi)容介紹上一回,聊了代理模式,虛擬代理,圖片懶加載,介一回,也比較容易,適配器模式,用一個(gè)新的接口對(duì)現(xiàn)有類的接口進(jìn)行包裝,處理類與的不匹配。這一回,主要聊了適配器模式,圖片預(yù)加載,主要還是理解下一回,聊一聊橋接模式,順便做一做計(jì)算題。 本回內(nèi)容介紹 上一回,聊了代理模式,虛擬代理,圖片懶加載,介一回,也比較容易,適配器模式(Adapter),用一個(gè)新的接口對(duì)現(xiàn)有類的接口進(jìn)行包裝,處...
摘要:本回內(nèi)容介紹上一回,聊了聊狀態(tài)模式,并介紹了一下介一回,聊鏈?zhǔn)骄幊蹋M一下,再模擬一下封裝一個(gè)庫。這一回,主要聊了鏈?zhǔn)秸{(diào)用,模擬了,尤其是,希望大家能喜歡這次代碼分享。下一回,聊一聊的策略模式。 本回內(nèi)容介紹 上一回,聊了聊狀態(tài)模式(State),并介紹了一下vue.js;介一回,聊鏈?zhǔn)骄幊蹋M一下jQuery,再模擬一下underscore.js,封裝一個(gè)庫。 1. 鏈?zhǔn)秸{(diào)用 (...
閱讀 533·2023-04-26 01:39
閱讀 4485·2021-11-16 11:45
閱讀 2609·2021-09-27 13:37
閱讀 882·2021-09-01 10:50
閱讀 3579·2021-08-16 10:50
閱讀 2217·2019-08-30 15:55
閱讀 2979·2019-08-30 15:55
閱讀 2259·2019-08-30 14:07