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

資訊專欄INFORMATION COLUMN

聽飛狐聊JavaScript設(shè)計(jì)模式系列07

BetaRabbit / 314人閱讀

摘要:本回內(nèi)容介紹上一回聊到單例模式,做了一道題,內(nèi)容不多,比較容易理解。這里其實(shí)還可以進(jìn)一步優(yōu)化,達(dá)到高聚類低耦合,這里工廠模式就告一段落了。

本回內(nèi)容介紹

上一回聊到JS單例模式(singleton),做了一道題,內(nèi)容不多,比較容易理解。
介一回嘞,聊聊工廠模式,之前聊到過工廠模式,這回聊深入點(diǎn)兒,可能會(huì)比較抽象,不過好在實(shí)際開發(fā)中使用還算廣泛,理解起來會(huì)比較容易,開始咯:

1. 簡(jiǎn)單工廠

比如我們創(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:

3. 簡(jiǎn)單工廠之抽象類

不同的用戶組有不同的角色,不同的角色擁有不同的權(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

相關(guān)文章

  • 飛狐JavaScript設(shè)計(jì)模式系列06

    本回內(nèi)容介紹 上一回聊到JS中模擬接口,裝飾者模式,摻元類,分析了backbone的繼承源碼,感覺還好吧! 介一回,偶們來聊一下在JS單例模式(singleton),單例模式其實(shí)運(yùn)用很廣泛,比如:jquery,AngularJS,underscore吖蝦米的都是單例模式,來吧,直接開始咯: 1. 單例模式 保證一個(gè)類只有一個(gè)實(shí)例,從全局命名空間里提供一個(gè)唯一的訪問點(diǎn)來訪問該對(duì)象。其實(shí)之前寫過的對(duì)象...

    hiYoHoo 評(píng)論0 收藏0
  • 飛狐JavaScript設(shè)計(jì)模式系列02

    摘要:本回內(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),記...

    tangr206 評(píng)論0 收藏0
  • 飛狐JavaScript設(shè)計(jì)模式系列11

    摘要:橋接模式之特權(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í)...

    wanglu1209 評(píng)論0 收藏0
  • 飛狐JavaScript設(shè)計(jì)模式系列10

    摘要:本回內(nèi)容介紹上一回,聊了代理模式,虛擬代理,圖片懶加載,介一回,也比較容易,適配器模式,用一個(gè)新的接口對(duì)現(xiàn)有類的接口進(jìn)行包裝,處理類與的不匹配。這一回,主要聊了適配器模式,圖片預(yù)加載,主要還是理解下一回,聊一聊橋接模式,順便做一做計(jì)算題。 本回內(nèi)容介紹 上一回,聊了代理模式,虛擬代理,圖片懶加載,介一回,也比較容易,適配器模式(Adapter),用一個(gè)新的接口對(duì)現(xiàn)有類的接口進(jìn)行包裝,處...

    yexiaobai 評(píng)論0 收藏0
  • 飛狐JavaScript設(shè)計(jì)模式系列14

    摘要:本回內(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)用 (...

    fox_soyoung 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<