国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

javascript設計模式之中介者模式Mediator

2019-11-20 13:33:09
字體:
來源:轉載
供稿:網友

一,總體概要

1,筆者淺談

我們從日常的生活中打個簡單的比方,我們去房屋中介租房,房屋中介人在租房者和房東出租者之間形成一條中介。租房者并不關心他租誰的房。房東出租者也不關心他租給誰。因為有中介的存在,這場交易才變得如此方便。

在軟件的開發過程中,勢必會碰到這樣一種情況,多個類或多個子系統相互交互,而且交互很繁瑣,導致每個類都必須知道他需要交互的類,這樣它們的耦合會顯得異常厲害。牽一發而動全身,后果很嚴重,大熊很生氣!~~~~(>_<)~~~~

好了,既然問題提出來了,那有請我們這期的主角------中介者模式出場吧

中介者的功能就是封裝對象之間的交互。如果一個對象的操作會引起其他相關對象的變化,而這個對象又不希望自己來處理這些關系,那么就可以去找中介者,讓它來處理這些麻煩的關系。看下面的小例子:

復制代碼 代碼如下:

var Participant = function(name) {
    this.name = name;
    this.chatroom = null;
};
Participant.prototype = {
    send: function(message, to) {
        this.chatroom.send(message, this, to);
    },
    receive: function(message, from) {
        log.add(from.name + " to " + this.name + ": " + message);
    }
};
var Chatroom = function() {
    var participants = {};
    return {
        register: function(participant) {
            participants[participant.name] = participant;
            participant.chatroom = this;
        },
        send: function(message, from, to) {
            if (to) {                  
                to.receive(message, from);   
            } else {                    
                for (key in participants) {  
                    if (participants[key] !== from) {
                        participants[key].receive(message, from);
                    }
                }
            }
        }
    };
};
var log = (function() {
    var log = "";
    return {
        add: function(msg) { log += msg + "/n"; },
        show: function() { alert(log); log = ""; }
    }
})();
function run() {
    var yoko = new Participant("Yoko");
    var john = new Participant("John");
    var paul = new Participant("Paul");
    var ringo = new Participant("Ringo");
    var chatroom = new Chatroom();
    chatroom.register(yoko);
    chatroom.register(john);
    chatroom.register(paul);
    chatroom.register(ringo);
    yoko.send("All you need is love.");
    yoko.send("I love you John.");
    john.send("Hey, no need to broadcast", yoko);
    paul.send("Ha, I heard that!");
    ringo.send("Paul, what do you think?", paul);
    log.show();
}

在示例代碼中我們有四個參與者,加入聊天會話通過注冊一個聊天室(中介)。每個參與者的參與對象的代表。參與者相互發送消息和聊天室的處理路由。

這里的聊天室對象就起到了中介的作用,協調其他的對象,進行合理的組織,降低耦合。

二,源碼案例參考

我們應該很熟悉MVC三層模型實體模型(Model)、視圖表現層(View)還有控制層(Control/Mediator)。

控制層便是位于表現層與模型層之間的中介者。籠統地說MVC也算是中介者模式在框架設計中的一個應用。

三,案例引入

復制代碼 代碼如下:

function Player(name) {
    this.points = 0;
    this.name = name;
}
Player.prototype.play = function () {
    this.points += 1;
    mediator.played();
};
var scoreboard = {
    element:document.getElementById('results'),
    update:function (score) {
        var i, msg = '';
        for (i in score) {
            if (score.hasOwnProperty(i)) {
                msg += '<p><strong>' + i + '<//strong>: ';
                msg += score[i];
                msg += '<//p>';
            }
        }
        this.element.innerHTML = msg;
    }
};
var mediator = {
    players:{},
    setup:function () {
        var players = this.players;
        players.home = new Player('Home');
        players.guest = new Player('Guest');
    },
    played:function () {
        var players = this.players,
                score = {
                    Home:players.home.points,
                    Guest:players.guest.points
                };
        scoreboard.update(score);
    },
    keypress:function (e) {
        e = e || window.event;
        if (e.which === 49) {
            mediator.players.home.play();
            return;
        }
        if (e.which === 48) {
            mediator.players.guest.play();
            return;
        }
    }
};
mediator.setup();
window.onkeypress = mediator.keypress;
setTimeout(function () {
    window.onkeypress = null;
    console.log('Game over!');
}, 30000);

四,總結一下

Why Mediator ?

各個對象之間的交互操作非常多,每個對象的行為操作都依賴彼此對方,修改一個對象的行為,同時會涉及到修改很多其他對象的行為,

如果使用Mediator模式,可以使各個對象間的耦合松散,只需關心和 Mediator的關系,使多對多的關系變成了一對多的關系,

可以降低系統的復雜性,提高可修改擴展性。

使用中介者模式的場合

1.一組定義良好的對象,現在要進行復雜的通信。

2.定制一個分布在多個類中的行為,而又不想生成太多的子類。

可以看出,中介對象主要是用來封裝行為的,行為的參與者就是那些對象,但是通過中介者,這些對象不用相互知道。(迪米特法則的具體實現)

使用中介者模式的優點:

1.降低了系統對象之間的耦合性,使得對象易于獨立的被復用。

2.提高系統的靈活性,使得系統易于擴展和維護。

使用中介者模式的缺點:

中介者模式的缺點是顯而易見的,因為這個“中介“承擔了較多的責任,所以一旦這個中介對象出現了問題,那么整個系統就會受到重大的影響。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 清徐县| 明光市| 西贡区| 新津县| 中宁县| 湟中县| 个旧市| 呼伦贝尔市| 永福县| 芜湖县| 响水县| 长泰县| 泾阳县| 茂名市| 上思县| 铅山县| 轮台县| 雅安市| 七台河市| 新建县| 增城市| 台东市| 株洲县| 浑源县| 阿尔山市| 夏邑县| 丘北县| 古蔺县| 平南县| 五指山市| 类乌齐县| 固阳县| 博客| 江油市| 襄汾县| 洛川县| 清涧县| 加查县| 安义县| 铁岭市| 长春市|