设计模式:观察者模式 -- ruby/tk小时钟

     以前看用java实现设计模式,很是头疼,那么多的java概念融合在里面,完全影响了对模式自身的理解。实现起来也是相当麻烦。但是在ruby中,模式理解起来是那么的容易,倒是觉得使用ruby来理解设计模式挺靠谱的。

     先介绍一种模式-观者者模式。

  百度百科名片 写道

观察者<Observer>模式(有时又被称为发布-订阅<Publish/Subscribe>模式、模型-视图<Model/View>模式、源-收听者<Source/Listener>模式或从属者<Dependents>模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。

      通俗点说就是A对象(被观察)通知另一个(一些)对象(观察者)自己发生改变了,改变了什么,至于你们这些对象要做什么就不关我的事了,你们自己做去吧!耦合度就此降低了。。。

 一段简单的Ruby 观察者模式的实现:

#!/usr/bin/env ruby

require 'observer'

class CheckWaterTemperature
  include Observable
  def run
    loop do
      changed()
      notify_observers(Time.now)
      sleep 1
    end
  end
end

class ClockView
  def update (time)
    puts time
  end
end

checker = CheckWaterTemperature.new
checker.add_observer(ClockView.new)
checker.run

 这段中代码包含两个类,顾名思义ClockView是用来展示的,而Clock就是被观察的对象了。当被观察的对象有改变的时候,应该通知观察者们它已经改变了。

在Ruby中通过mix-in方式(类似于java的接口)实现被观察的对象,它的接口有这些:

#add_observer //增加观察者
#changed        //改变当前的状态
#changed?      // 查询放钱的状态
#count_observers //计数
#delete_observer   //删除一个
#delete_observers //删除一些
#notify_observers //通知观察者们,我已经改变了

 而观察者只要实现一个方法update,这样通知发生的时候,观察者要做什么就由update实现来决定了。。很容易理解啊。。

上面的示例是通过控制台实现的。

彩蛋:增加一个GUI实现,TK,文档可真不好找啊.. 

地址: http://www.oschina.net/code/snippet_270852_9935

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
“ bundler: failed to load command: pod (/opt/homebrew/Cellar/fastlane/2.211.0/libexec/bin/pod)RubyGems Environment:- RUBYGEMS VERSION: 3.0.3.1- RUBY VERSION: 2.6.10 (2022-04-12 patchlevel 210) [universal.arm64e-darwin22]- INSTALLATION DIRECTORY: /Library/Ruby/Gems/2.6.0- USER INSTALLATION DIRECTORY: /Users/e125866/.gem/ruby/2.6.0- RUBY EXECUTABLE: /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby- GIT EXECUTABLE: /usr/local/bin/git- EXECUTABLE DIRECTORY: /usr/local/bin- SPEC CACHE DIRECTORY: /Users/e125866/.gem/specs- SYSTEM CONFIGURATION DIRECTORY: /Library/Ruby/Site- RUBYGEMS PLATFORMS:- ruby- universal-darwin-22- GEM PATHS:- /Library/Ruby/Gems/2.6.0- /Users/e125866/.gem/ruby/2.6.0- /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/gems/2.6.0- GEM CONFIGURATION:- :update_sources => true- :verbose => true- :backtrace => false- :bulk_threshold => 1000- :sources => ["https://gems.ruby-china.com/"]- :concurrent_downloads => 8- REMOTE SOURCES:- https://gems.ruby-china.com/- SHELL PATH:- /opt/apache-maven-3.8.6/bin- /opt/homebrew/bin- /opt/homebrew/sbin- /usr/local/bin- /System/Cryptexes/App/usr/bin- /usr/bin- /bin- /usr/sbin- /sbin- /usr/local/sbin- /Library/Apple/usr/bin- /var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin- /var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin- /var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin- /Users/e125866/.rvm/bin”这个有问题吗?
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值