麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > Ruby > 正文

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

2020-10-29 19:43:27
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

面試被問(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)系。書中還舉了一個(gè)非常易懂的例子:獲取系統(tǒng)當(dāng)前時(shí)間并輸出到命令行中。如果要硬編碼也很簡(jiǎn)單,定義一個(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教程來(lái)讀的,后來(lái)發(fā)現(xiàn)根本不是,書中用非常易懂的語(yǔ)言深入淺出的講明白了很多深?yuàn)W的哲學(xué)思想。雖然這本書對(duì)我這種剛?cè)腴T的菜鳥(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)也不麻煩,就是得寫些工具函數(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可以讓我們專注于程序設(shè)計(jì)本身,而不是程序的語(yǔ)法和特性。js靈活多變,是一門完備的編程語(yǔ)言除了生孩子什么都能實(shí)現(xiàn),就是玩起來(lái)要下點(diǎn)功夫。php嘛,中規(guī)中矩,沒(méi)啥好說(shuō)的。

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久国产中文 | 在线亚洲欧美日韩 | 视频一区二区国产 | 亚洲操比视频 | 欧美成人黄色小视频 | 中国精品久久 | 电影av在线| 欧洲成人av | 国产一级在线免费观看 | 国产精品免费麻豆入口 | 欧美不卡视频在线观看 | 国产精品资源手机在线播放 | a网站在线 | 国产成人精品免高潮在线观看 | 免费观看视频网站 | 国产精品免费成人 | 精品国产一级毛片 | 国产午夜精品一区二区三区免费 | 久久久久久久久浪潮精品 | 爱操影视| 国产精品久久久久久久亚洲按摩 | 55夜色66夜色国产精品视频 | www视频免费观看 | 永久免费黄色大片 | 色女人在线 | 免费看污视频在线观看 | 免费a网 | 一级黄色毛片免费 | 国产成人高清在线观看 | 中国fx性欧美xxxx | 国产一级一区二区三区 | 92精品国产自产在线 | 欧美成人精品欧美一级乱黄 | 欧美伦理一区二区 | 中文字幕国产欧美 | 九九热久久免费视频 | 女人解衣喂奶电影 | 国产午夜精品一区二区三区四区 | 欧美一级电影网 | 久久精品国产精品亚洲 | 欧美一级一片 |