国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類(lèi)導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Ruby - ruby、javascript、php中的觀察者模式實(shí)現(xiàn)代碼

ruby、javascript、php中的觀察者模式實(shí)現(xiàn)代碼

2020-04-19 11:33腳本之家 Ruby

這篇文章主要介紹了ruby、javascript、php中的觀察者模式實(shí)現(xiàn)代碼,通過(guò)本文可以深入的理解觀察者模式,需要的朋友可以參考下

面試被問(wèn)及到j(luò)s中的觀察者模式,這玩意兒早就了解過(guò),可以說(shuō)是動(dòng)態(tài)語(yǔ)言中非常有用的一個(gè)設(shè)計(jì)模式,非常慚愧的沒(méi)有系統(tǒng)的研究過(guò)。不過(guò)沒(méi)關(guān)系,哪里不會(huì)補(bǔ)哪里,立刻動(dòng)手,用所會(huì)的語(yǔ)言都實(shí)現(xiàn)一遍。

觀察者模式

關(guān)于觀察者模式,《松本行弘的程序世界》講的非常清楚:觀察者模式是當(dāng)某個(gè)對(duì)象狀態(tài)發(fā)生變化時(shí),依存于該狀態(tài)的全部對(duì)象自動(dòng)得到通知,被觀察者和觀察者們是一對(duì)多的關(guān)系。書(shū)中還舉了一個(gè)非常易懂的例子:獲取系統(tǒng)當(dāng)前時(shí)間并輸出到命令行中。如果要硬編碼也很簡(jiǎn)單,定義一個(gè)方法,先獲取時(shí)間,然后再處理展示。這樣獲取時(shí)間的功能基本就不能復(fù)用了,因?yàn)閹Я藗€(gè)處理展示的拖油瓶。

如果用觀察者模式則可以這樣:定義兩個(gè)類(lèi),一個(gè)用于計(jì)時(shí),獲取當(dāng)前時(shí)間;另一個(gè)用于展示時(shí)間。展示時(shí)間的類(lèi)就是觀察者,這樣做的好處是降低相互的依賴(lài)性。第一個(gè)類(lèi)改變后不需要處理任何事物,只需要發(fā)出通知告訴它的觀察者們,具體事物由它們處理。比如有一天我們想換種形式展示時(shí)間,或者用多種方式展示時(shí)間,完全不需要牽扯到第一個(gè)類(lèi)。

PS:《松本行弘的程序世界》真是一本好書(shū)。起初是想把這本書(shū)當(dāng)做ruby教程來(lái)讀的,后來(lái)發(fā)現(xiàn)根本不是,書(shū)中用非常易懂的語(yǔ)言深入淺出的講明白了很多深?yuàn)W的哲學(xué)思想。雖然這本書(shū)對(duì)我這種剛?cè)腴T(mén)的菜鳥(niǎo)來(lái)說(shuō)幾乎沒(méi)有什么實(shí)用價(jià)值,但是讀完之后有種豁然開(kāi)朗的感覺(jué),是一次非常好的閱讀體驗(yàn)。

ruby實(shí)現(xiàn)

用ruby實(shí)現(xiàn)觀察者模式簡(jiǎn)直簡(jiǎn)單清晰的令人發(fā)指,上代碼:

 

復(fù)制代碼 代碼如下:

require "observer"
#被觀察者
class Subject
    include Observable
    def notify
        #do sth
        changed #更新標(biāo)志為真
        notify_observers(*args) #如果更新標(biāo)志為真,調(diào)用觀察者帶參數(shù)args的方法
    end
end
#觀察者
class Obs
    #回調(diào)函數(shù),好像只能這么叫
    def update
        #do sth
    end
end
#實(shí)例
sub = Subject.new
sub.add_observer(Obs.new)
sub.notify

 

沒(méi)錯(cuò),就是這么簡(jiǎn)單。。。
主要是依靠Observer模塊,除了上面用到的,此模塊還有如下接口:

1.delete_observer(obj) 刪除特定的觀察者
2.delete_observers 刪除全部觀察者
3.count_observers 獲取觀察者數(shù)目
4.changed? 檢查更新標(biāo)志

php實(shí)現(xiàn)

php實(shí)現(xiàn)起來(lái)也不麻煩:

復(fù)制代碼 代碼如下:

//被觀察者
class Subject
{
    private $_observers;
    public function __construct() {
        $this->_observers = array();
    }
    public function add_observer($obs) {
        $this->_observers[] = $obs;
    }
    public funtion delete_observer($bos) {
        $index = array_search($bos, $this->_observers);
        unset($this->_observers[$index]);
    }
    public function notify_observers() {
        foreach($this->_observers as $v) {
            $v->update();
        }
    }
}
//觀察者
class Observer
{
    public function __construct() {
        do sth;
    }
    public function update() {
        do sth;
    }
}
//實(shí)例
$sub = new Subject();
$obs = new Observer();
$sub->add_observer($obs);
$sub->notify_observers();

 

js實(shí)現(xiàn)

js實(shí)現(xiàn)起來(lái)也不麻煩,就是得寫(xiě)些工具函數(shù)方便用,比如刪除數(shù)組指定的元素。下面只用最簡(jiǎn)單的實(shí)現(xiàn)方法。

復(fù)制代碼 代碼如下:

//被觀察者
function Subject() {
    var _this = this;
    this.observers = [];
    this.addObserver = function(obj) {
        _this.observers.push(obj);
    }
    this.deleteObserver = function(obj) {
        var length = _this.observers.length;
        for(var i = 0; i < length; i++) {
            if(_this.observers[i] === obj) {
                _this.observers.splice(i, 1);
            }
        }
    }
    this.notifyObservers = function() {
        var length = _this.observers.length;
        console.log(length)
        for(var i = 0; i < length; i++) {
            _this.observers[i].update();
        }
    }
}
//觀察者
function Observer() {
    this.update = function() {
        alert(1)
    }
}
var sub = new Subject();
var obs = new Observer();
sub.addObserver(obs);
sub.notifyObservers();
var sub = new Subject();

 

結(jié)論:ruby可以讓我們專(zhuān)注于程序設(shè)計(jì)本身,而不是程序的語(yǔ)法和特性。js靈活多變,是一門(mén)完備的編程語(yǔ)言除了生孩子什么都能實(shí)現(xiàn),就是玩起來(lái)要下點(diǎn)功夫。php嘛,中規(guī)中矩,沒(méi)啥好說(shuō)的。

這仨程序都跑起來(lái)后算是徹底明白這個(gè)設(shè)計(jì)模式了。

延伸 · 閱讀

精彩推薦
  • RubyRuby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    這篇文章主要介紹了Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例,建造者模式將一個(gè)復(fù)雜對(duì)象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表...

    范孝鵬2192020-05-07
  • Ruby簡(jiǎn)要說(shuō)明Ruby中的迭代器

    簡(jiǎn)要說(shuō)明Ruby中的迭代器

    這篇文章主要介紹了Ruby中的迭代器,迭代器的概念在動(dòng)態(tài)語(yǔ)言的編程中十分重要,文章中介紹了Ruby中的each迭代器和collect迭代器,需要的朋友可以參考下 ...

    goldensun2772020-04-25
  • Ruby剖析 Ruby 訪問(wèn)控制

    剖析 Ruby 訪問(wèn)控制

    前面,我們說(shuō) Ruby 沒(méi)有函數(shù),只有方法.而且實(shí)際上有不止一種方法.這一節(jié)我們介紹 訪問(wèn)控制 (accesscontrols). 想想當(dāng)我們?cè)谧罡邔佣皇窃谝粋€(gè)類(lèi)的定義里定義...

    ruby教程網(wǎng)3572020-04-08
  • RubyCentOS中配置Ruby on Rails環(huán)境

    CentOS中配置Ruby on Rails環(huán)境

    經(jīng)過(guò)一個(gè)上午的折騰,終于把ROR環(huán)境在CentOS中搞定,繞了很多彎路,把文章寫(xiě)下來(lái)總結(jié)一下 ...

    可樂(lè)加糖4762020-04-12
  • RubyRuby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼,數(shù)據(jù)是隨機(jī)的,所以每次的記錄都會(huì)不同。 ...

    ruby教程網(wǎng)2962020-04-10
  • RubyRuby簡(jiǎn)潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類(lèi)和對(duì)象

    Ruby簡(jiǎn)潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類(lèi)和對(duì)象

    這篇文章主要介紹了Ruby簡(jiǎn)潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類(lèi)和對(duì)象,本文是學(xué)習(xí)筆記第一篇,需要的朋友可以參考下 ...

    腳本之家2472020-04-20
  • RubyRuby迭代器的7種技巧分享

    Ruby迭代器的7種技巧分享

    這篇文章主要介紹了Ruby迭代器的7種技巧分享,Ruby中的迭代器非常人性化,本文既是講解了7個(gè)技巧也是講解了7種迭代器,需要的朋友可以參考下 ...

    腳本之家4782020-04-20
  • RubyRuby環(huán)境下安裝使用bundler來(lái)管理多版本的gem

    Ruby環(huán)境下安裝使用bundler來(lái)管理多版本的gem

    這篇文章主要介紹了Ruby環(huán)境下安裝使用bundler來(lái)管理多版本的gem的方法,舉了Ruby On Rails中的應(yīng)用實(shí)例來(lái)進(jìn)行演示,需要的朋友可以參考下 ...

    日拱一卒4332020-05-10
主站蜘蛛池模板: 黄视频免费观看 | 久久蜜桃av一区二区天堂 | 一级片在线观看 | 亚洲自拍偷拍精品 | 亚洲特黄一级 | 久久国产精品视频 | 视频一区中文字幕 | 久久精品无码一区二区三区 | 91资源在线视频 | 久草在线视频免费播放 | 国产欧美在线观看 | 天天干人人 | 久久久毛片 | 日韩在线观看中文字幕 | 在线一级片| www.国产一区 | 一级录像免费录像在线观看 | 黄在线免费观看 | 日韩美一级片 | 性做久久久久久 | 国产免费高清 | 国产伦精品一区二区三区照片91 | 午夜电影网站 | 在线看国产| 老师的朋友2 | www.久久精品 | 久久久久国产一区二区三区 | 久久99精品国产自在现线 | 精品视频在线观看 | 国产精品视频久久 | 影音先锋男 | 在线观看国产一区二区 | 久久久久久久国产精品 | 操操操干干 | 国产精品18久久久久vr手机版特色 | www免费在线观看 | 在线日韩视频 | 天天干夜夜拍 | 日韩欧美一区二区三区 | 成人国产精品视频 | 日韩黄网站 |