一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

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

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

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

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

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

觀察者模式

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

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

PS:《松本行弘的程序世界》真是一本好書。起初是想把這本書當做ruby教程來讀的,后來發(fā)現(xiàn)根本不是,書中用非常易懂的語言深入淺出的講明白了很多深奧的哲學思想。雖然這本書對我這種剛?cè)腴T的菜鳥來說幾乎沒有什么實用價值,但是讀完之后有種豁然開朗的感覺,是一次非常好的閱讀體驗。

ruby實現(xiàn)

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

 

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

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

 

沒錯,就是這么簡單。。。
主要是依靠Observer模塊,除了上面用到的,此模塊還有如下接口:

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

php實現(xiàn)

php實現(xiàn)起來也不麻煩:

復(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;
    }
}
//實例
$sub = new Subject();
$obs = new Observer();
$sub->add_observer($obs);
$sub->notify_observers();

 

js實現(xiàn)

js實現(xiàn)起來也不麻煩,就是得寫些工具函數(shù)方便用,比如刪除數(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可以讓我們專注于程序設(shè)計本身,而不是程序的語法和特性。js靈活多變,是一門完備的編程語言除了生孩子什么都能實現(xiàn),就是玩起來要下點功夫。php嘛,中規(guī)中矩,沒啥好說的。

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

延伸 · 閱讀

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

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

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

    范孝鵬2192020-05-07
  • Ruby簡要說明Ruby中的迭代器

    簡要說明Ruby中的迭代器

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

    goldensun2772020-04-25
  • Ruby剖析 Ruby 訪問控制

    剖析 Ruby 訪問控制

    前面,我們說 Ruby 沒有函數(shù),只有方法.而且實際上有不止一種方法.這一節(jié)我們介紹 訪問控制 (accesscontrols). 想想當我們在最高層而不是在一個類的定義里定義...

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

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

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

    可樂加糖4762020-04-12
  • RubyRuby進行文件信息輸出實例代碼

    Ruby進行文件信息輸出實例代碼

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

    ruby教程網(wǎng)2962020-04-10
  • RubyRuby簡潔學習筆記(一):字符串、數(shù)字、類和對象

    Ruby簡潔學習筆記(一):字符串、數(shù)字、類和對象

    這篇文章主要介紹了Ruby簡潔學習筆記(一):字符串、數(shù)字、類和對象,本文是學習筆記第一篇,需要的朋友可以參考下 ...

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

    Ruby迭代器的7種技巧分享

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

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

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

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

    日拱一卒4332020-05-10
主站蜘蛛池模板: 日本动漫xxxxxx | 亚1洲二区三区四区免费 | 久久久久久久久女黄9999 | 日本大乳护士的引诱图片 | 亚洲天堂免费 | 亚洲视频久久 | 美女gif趴跪式抽搐动态图 | 四虎免费影院4hu永久免费 | 全彩成人18h漫画 | 国产动作大片 | 亚洲第一免费播放区 | 小便japanesewctv | 欧洲第一页 | 好看华人华人经典play | 久久婷婷丁香五月色综合啪免费 | 波多野结在线 | 国产一区二区三区在线 | 亚洲国产精品嫩草影院永久 | 视频在线观看一区二区三区 | 忘忧草在线 | 俄罗斯年轻男同gay69 | 咪咪爱在线视频 | 国内精品国语自产拍在线观看55 | 日本无遮挡亲吻膜下面免费 | 青青草99热这里都是精品 | 99久久免费看精品国产一区 | 久草在线福利视频在线播放 | 国产高清自拍 | 好大~好爽~再进去一点 | 国产专区一va亚洲v天堂 | 成人特级毛片69免费观看 | 欧美国产日产精品免费视频 | 国产成人yy精品1024在线 | 亚洲黄视频在线观看 | 娇妻终于接受了3p的调教 | 久久久久久免费观看 | 国产福利一区二区三区四区 | 女人和男人搞鸡 | 男女18一级大黄毛片免 | 欧美久在线观看在线观看 | 激情乱文 |