激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(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)代碼,通過本文可以深入的理解觀察者模式,需要的朋友可以參考下

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

觀察者模式

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

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

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

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

用ruby實(shí)現(xià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

 

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

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

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

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

 

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

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

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

延伸 · 閱讀

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

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

    這篇文章主要介紹了Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例,建造者模式將一個(gè)復(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ù),只有方法.而且實(shí)際上有不止一種方法.這一節(jié)我們介紹 訪問控制 (accesscontrols). 想想當(dāng)我們在最高層而不是在一個(gè)類的定義里定義...

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

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

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

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

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

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

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

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

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

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

    Ruby迭代器的7種技巧分享

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

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

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

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

    日拱一卒4332020-05-10
主站蜘蛛池模板: 88xx成人永久免费观看 | 亚洲电影免费观看国语版 | 国产日韩免费观看 | av免费在线网站 | videos高潮| 午夜影院在线免费观看 | 亚洲精品一区二区三区大胸 | 欧美伦理一区二区 | 成人在线免费观看小视频 | 成人精品一区二区 | 精品一区二区三区欧美 | free japan xxxxhdsex69| 日韩视频一二三 | 好吊色欧美一区二区三区四区 | 九色p| 二区三区四区视频 | 天天操天天看 | chinesexxxx刘婷hd 国产91在线播放九色 | 精品一区二区在线观看视频 | 久久伊人精品热在75 | 精品久久一区二区 | 国产午夜精品在线 | 国产精品视频六区 | 中文在线日韩 | 国产精品片一区二区三区 | 伊人午夜| 男女无套免费视频 | 欧美成人精品h版在线观看 国产一级淫片在线观看 | 黄www片| 手机免费看一级片 | 成人aaaaa片毛片按摩 | 中文区永久区 | 午夜爽爽爽男女免费观看hd | 成人在线免费观看网址 | 国产精品www | 在线成人一区二区 | 亚洲一级簧片 | 亚洲一级成人 | 成人免费福利网站 | 黄色的视频免费观看 | 亚洲综合无码一区二区 |