成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

觀察者模式實(shí)現(xiàn)非直接耦合

binaryTree / 1124人閱讀

摘要:子模塊統(tǒng)一實(shí)現(xiàn)監(jiān)聽方法,供主模塊觸發(fā)執(zhí)行自己的觀察方法,具體由子類實(shí)現(xiàn)。子模塊統(tǒng)一實(shí)現(xiàn)將自己的變化告知主模塊的方法主模塊包含一個子模塊列表子模塊統(tǒng)一實(shí)現(xiàn)方法,將自己添加到主模塊的子模塊列表中。

最近在看設(shè)計模式,一本《Head First 設(shè)計模式》,一本《javascript設(shè)計模式》,兩本交替著看。Head First淺顯易懂,代碼用java實(shí)現(xiàn),理解了一個設(shè)計模式的理念以后,先想想用js如何實(shí)現(xiàn),然后再看js設(shè)計模式相關(guān)章節(jié),感覺比以前看的時候理解深入了些。

今天早上看到顏海鏡同學(xué)在早讀課上分享的耦合關(guān)系一文,最后一種模塊間非直接耦合的實(shí)現(xiàn)方式第一個讓我想到的就是觀察者模式。正好上午沒事,就寫了個demo實(shí)現(xiàn)了一下。

非直接耦合:兩個模塊之間沒有直接關(guān)系,它們之間的聯(lián)系完全是通過主模塊的控制和調(diào)用來實(shí)現(xiàn)的。耦合度最弱,模塊獨(dú)立性最強(qiáng)。子模塊無需知道對方的存在,子模塊之間的聯(lián)系,全部變成子模塊和主模塊之間的聯(lián)系。

現(xiàn)在要實(shí)現(xiàn)這樣的功能:

所有模塊只和主模塊通訊,可以把自己的變化告知主模塊,也可以從主模塊接受信息并處理;

主模塊負(fù)責(zé)監(jiān)聽所有其下的模塊的變化,一旦認(rèn)為該變化需要通知到指定一個或多個其他模塊,就向這些模塊發(fā)送消息。

大體實(shí)現(xiàn)思路是:

子模塊包含一個主模塊的引用,在實(shí)例化方法中將其對應(yīng)的主模塊實(shí)例作為參數(shù)賦值給自己的主模塊引用。

constructor(hub) {
    this._hub = hub;
}
    

子模塊統(tǒng)一實(shí)現(xiàn)監(jiān)聽方法observeFromHub,供主模塊觸發(fā)執(zhí)行自己的觀察方法,具體由子類實(shí)現(xiàn)。

observeFromHub() {
    throw new Error("no implementation.");
}

子模塊統(tǒng)一實(shí)現(xiàn)將自己的變化告知主模塊的方法update(value)

update(value){
    this._hub.observeFromModule(value);
}

主模塊包含一個子模塊列表

constructor(){
    this.modules = [];
}

子模塊統(tǒng)一實(shí)現(xiàn)add/remove方法,將自己添加到主模塊的子模塊列表modules中。

add(hub) {
    var alreadyExists = hub.modules.some((el)=>el === this);
    if (!alreadyExists) hub.modules.push(this);
    return this;
}

remove(hub) {
    hub.modules = hub.modules.filter((el)=>el !== this);
    return this;
}

主模塊實(shí)現(xiàn)觸發(fā)子模塊列表中所有子模塊的監(jiān)聽方法。

deliver(data){
    this.modules.forEach((module) => module.observeFromHub(data));
    return this;
}

主模塊實(shí)現(xiàn)監(jiān)聽方法observeFromModule,供子模塊觸發(fā)執(zhí)行自己的觀察方法,由此來感知子模塊的變化,進(jìn)而執(zhí)行deliver方法通知其下所有子模塊。

observeFromModule(data) {
    return this.deliver(data);
}

有些方法子模塊是公用的,所以可以將這些公共方法提取出來作為子模塊的抽象超類

CommonModule.js

module.exports = class CommonModule {
    constructor(hub) {
        this._hub = hub;
    }
    
    update(value){
        this._hub.observeFromModule(value);
    }

    observeFromHub() {
        throw new Error("no implementation.");
    }

    add(hub) {
        var alreadyExists = hub.modules.some((el)=>el === this);
        if (!alreadyExists) hub.modules.push(this);
        return this;
    }

    remove(hub) {
        hub.modules = hub.modules.filter((el)=>el !== this);
        return this;
    }
}

observeFromHub方法有子模塊自己實(shí)現(xiàn)。這里創(chuàng)建兩個子模塊Module1和Module2。當(dāng)修改Module1時,主模塊通知Module2執(zhí)行observerFromHub(value)方法:

Module1.js

var CommonModule = require("./CommonModule");
module.exports = class Module1 extends CommonModule{
    constructor(hub) {
        super(hub);
        this.inputValue = "";
    }

    update(value) {
        this.inputValue = value;
        console.log("module1 setInput start... :" + this.inputValue);
        super.update(value);
    }
}

Module2.js

var CommonModule = require("./CommonModule");
module.exports = class Module2 extends CommonModule{
    constructor(hub) {
        super(hub);
        this.outputValue = "";
    }

    observeFromHub(value) {
        this.outputValue = value;
        console.log("module2 received msg : " + this.outputValue);
    }
}

主模塊代碼:

Hub.js

module.exports = class Hub {
    constructor(){
        this.modules = [];
    }

    observeFromModule(data) {
        return this.deliver(data);
    }
    
    deliver(data){
        this.modules.forEach((module) => module.observeFromHub(data));
        return this;
    }
}

客戶端代碼:

main.js

var Hub = require("./Hub");
var Module1 = require("./Module1");
var Module2 = require("./Module2");

var hub = new Hub;
var inputModule = new Module1(hub);
var outputModule = new Module2(hub);

outputModule.add(hub);

inputModule.update("this is m1 speaking...");

執(zhí)行main.js結(jié)果:

module1 setInput start... :this is m1 speaking...
module2 received msg : this is m1 speaking...

這個例子中主模塊既是觀察者,觀察ModuleA的變化,又是被觀察者,被ModuleB觀察著,A一有變化就會將信息發(fā)送給B。

還能想到的一些有趣變化:

主模塊可以有多個,各自管轄的范圍不同,但有些子模塊可能會在多個范圍中公用。

主模塊中添加控制器,數(shù)據(jù)需不需要下發(fā),下發(fā)到那幾個子模塊,由主模塊控制。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/80340.html

相關(guān)文章

  • 一文理清21種設(shè)計模式:用實(shí)例分析和對比

    摘要:設(shè)計模式無論是對于最底層的的編碼實(shí)現(xiàn)還是較高層的架構(gòu)設(shè)計都有著重要的指導(dǎo)作用。所謂光說不練假把式,今天我就把項目中常見的應(yīng)用場景涉及到的主要設(shè)計模式及其相關(guān)設(shè)計模式總結(jié)一下,用實(shí)例分析和對比的方式在一片文章中就把最常見的種設(shè)計模式梳理清楚。 設(shè)計模式無論是對于最底層的的編碼實(shí)現(xiàn)還是較高層的架構(gòu)設(shè)計都有著重要的指導(dǎo)作用。所謂光說不練假把式,今天我就把項目中常見的應(yīng)用場景涉及到的主要設(shè)計模...

    PrototypeZ 評論0 收藏0
  • “大話”設(shè)計模式

    摘要:抽象工廠模式是為了處理對象具有等級結(jié)構(gòu)以及對象族的問題。單例設(shè)計模式單例模式確保某一個類只有一個實(shí)例,而且自行實(shí)例化并向整個系統(tǒng)提供這個實(shí)例,這個類成為單例類。 導(dǎo)語:設(shè)計模式是無數(shù)碼農(nóng)前人在實(shí)際的生產(chǎn)項目中經(jīng)過不斷的踩坑、爬坑、修坑的經(jīng)歷總結(jié)出來的經(jīng)驗教訓(xùn),經(jīng)過抽象之后表達(dá)成的概念。能夠幫助后來的設(shè)計者避免重復(fù)同樣的錯誤或者彎路。我也抽空整理了一下設(shè)計模式,用自己的話總結(jié)了一下,自認(rèn)...

    coordinate35 評論0 收藏0
  • 通俗易懂的設(shè)計模式

    摘要:面向?qū)ο笤O(shè)計模式通常以類別或?qū)ο髞砻枋銎渲械年P(guān)系和相互作用,但不涉及用來完成應(yīng)用程序的特定類別或?qū)ο蟆@锸洗鷵Q原則里氏代換原則是面向?qū)ο笤O(shè)計的基本原則之一。 通俗易懂的設(shè)計模式 零、使用 1、安裝 2、測試 一、什么是設(shè)計模式 二、設(shè)計模式的類型 三、設(shè)計模式的六大原則 四、UML類圖 1、看懂UML類圖 2、解釋 五、資料 前言:花了一些時間再次熟悉了一遍...

    wuyangnju 評論0 收藏0
  • 架構(gòu)師必收藏的干貨?。?!

    摘要:一微服務(wù)概念微服務(wù)體系結(jié)構(gòu)由輕量級松散耦合的服務(wù)集合組成。每個服務(wù)都有自己的計劃測試發(fā)布部署擴(kuò)展集成和獨(dú)立維護(hù)。團(tuán)隊不必因為過去的技術(shù)決定而受到懲罰。用在這里是指將相關(guān)的服務(wù)通過聚合器聚合在一起,這個聚合器就是門面。 微服務(wù)架構(gòu)現(xiàn)在是談到企業(yè)應(yīng)用架構(gòu)時必聊的話題,微服務(wù)之所以火熱也是因為相對之前的應(yīng)用開發(fā)方式有很多優(yōu)點(diǎn),如更靈活、更能適應(yīng)現(xiàn)在需求快速變更的大環(huán)境。 一、微服務(wù)概念 微服...

    shiweifu 評論0 收藏0
  • python設(shè)計模式

    摘要:在本節(jié)實(shí)驗中,我們學(xué)習(xí)了四種設(shè)計模式策略模式,觀察者模式,命令模式以及模板方法模式。這四種設(shè)計模式都是行為型模式。這就是適配器模式。下面讓我們看看適配器模式在實(shí)驗樓中使用吧。準(zhǔn)確來說,裝飾者模式能動態(tài)的給對象添加行為。 1、策略模式 策略模式將各種操作(算法)進(jìn)行封裝,并使它們之間可以互換?;Q的意思是說可以動態(tài)改變對象的操作方式(算法)。 -- coding: utf-8 -- im...

    array_huang 評論0 收藏0

發(fā)表評論

0條評論

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