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

腳本之家,腳本語言編程技術(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
主站蜘蛛池模板: 天天爱天天做天天爽天天躁 | www.9p234.com| 精品国产国偷自产在线观看 | 亚洲精品国产SUV | 暴露狂婷婷医院暴露tx | 国产成人综合一区人人 | 久久视频这里只精品99热在线观看 | 欧美日韩一区二区综合在线视频 | 亚洲精品久久麻豆蜜桃 | a级亚洲片精品久久久久久久 | 国产高清不卡视频在线播放 | 嫩草影院永久一二三入口 | 男人的天堂久久精品激情a 男人的天堂va | 高清国产欧美一v精品 | 丰满艳妇亲伦视频 | 我们中文在线观看免费完整版 | 啊好爽视频 | 91精品手机国产在线观 | 热穴高校| 黑人干我 | haodiaose在线精品免费观看 | 2020国产精品亚洲综合网 | 婷婷色六月 | 无耻三级在线观看 | 欧美成人另类人妖 | 美女被草哭 | 四虎综合九九色九九综合色 | 国产女乱淫真高清免费视频 | 国产欧美日韩免费一区二区 | 国产一区二区三区欧美精品 | 天天做天天玩天天爽天天 | 动漫jk美女被爆羞羞漫画 | 色婷婷综合久久久中文字幕 | 亚洲精品国产成人99久久 | 国产99er66在线视频 | 日韩欧美一区二区三区免费观看 | 午夜片无码区在线观看 | 国产精品对白刺激久久久 | 国产三级精品久久三级国专区 | 亚洲a在线视频 | 乌克兰xxxxx|