这篇文章主要介绍了设计模式中的观察者模式在Ruby编程中的运用实例解析,观察者模式中主张设立观察者对象来对象之间的耦合,需要的朋友可以参考下

观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。
在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时发出通知。
这通常透过呼叫各观察者所提供的方法来实现。

实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能
体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,
从根本上违反面向对象的设计的原则。无论是观察者“观察”观察对象,
pk10开奖结果 还是被观察者将自己的改变“通知”观察者,都不应该直接调用。

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

下面的例子使用ruby的module实现了较为传统的观察者模式。使用module的好处是:subject类可能是其他基类的子类,mixin实现了类似多继承的效果。

module Subject
 def initialize
  @observers = []
 end

 def add_observer ob
  @observers << ob
 end

 def delete_observer ob
  @observers.delete ob
 end

 def notify_observers
  @observers.each do |ob|
   ob.update self
  end
 end
end

class Employee
 include Subject
 attr_reader :name, :title
 attr_reader :salary

 def initialize name, title, salary
  super()
  @name = name
  @title = title
  @salary = salary
 end

 def salary=new_salary
  @salary = new_salary
  notify_observers
 end
end

class Taxman
 def update obj
  puts "#{obj.name} now has a salary of #{obj.salary}"
 end
end

jack = Employee.new('jack', 'prgramer', 3000)
jack.add_observer(Taxman.new)
jack.salary = 3000

我们可以自己实现Subject module,不过这样做有些画蛇添足,因为ruby核心库本身就包含了Observable模块,我们只需要将其mixin代码既可。

require 'observer'

class Employee
 include Observable

 attr_reader :name, :title, :salary

 def initialize name, title, salary
  @name = name
  @title = title
  @salary = salary
 end 

 def salary=(new_salary)
  @salary = new_salary
  changed
  notify_observers(self)
 end # salary=
end # Employee

在notify_observers之前必须先调用changed方法,表示确实发生了改变,否则notify_observers方法是无效的。

最新资讯
5G手机三季度排队亮相 但年内渗透率不足整体市场1%

5G手机三季度排队亮相

5G手机的“百米冲刺”到了最后阶段,第一波5G手机出货潮
AI作曲颠覆音乐产业 95%从业者可能被取代

AI作曲颠覆音乐产业 9

过去几年,许多科技公司、研究机构和个人都在探索利用AI
外管局关注跨境支付“无证驾驶”

外管局关注跨境支付“

跨境支付市场近期不平静,对于“无证驾驶”机构而言,可谓
苹果突然在印度停售多款手机

苹果突然在印度停售多

印度停售iPhone SE、iPhone 6、iPhone 6Plus 和 iPhon
5G时代须警惕短视频侵权大爆发

5G时代须警惕短视频侵

随着5G时代的到来,短视频或将迎来新一轮爆发。
蔚来拟拆分NIO Power独立融资

蔚来拟拆分NIO Power

蔚来将拆分旗下能源补给服务NIO Power,寻求在今年四季
最新文章
Ruby编写HTML脚本替换小程序的实例分享

Ruby编写HTML脚本替换

这篇文章主要介绍了Ruby编写HTML脚本替换小程序的实例
解析proxy代理模式在Ruby设计模式开发中的运用

解析proxy代理模式在R

这篇文章主要介绍了proxy代理模式在Ruby设计模式开发
Ruby on Rails中Rack中间件的基础学习教程

Ruby on Rails中Rack

Rack是一个连接Ruby程序与服务器程序之间的中间件,甚
以MVC的思维方式来理解Ruby on Rails框架的设计结构

以MVC的思维方式来理

RubyonRails是Ruby世界中Web开发框架的代名词,人气相
Ruby基本的环境变量设置以及常用解释器命令介绍

Ruby基本的环境变量设

这篇文章主要介绍了Ruby基本的环境变量设置以及常用解
Ruby的基础语法入门学习教程

Ruby的基础语法入门学

这篇文章主要介绍了Ruby的基础语法入门学习教程,包括
pk10开奖结果_CrErEjF pk10开奖结果_Is51q pk10开奖结果_Y2CFqP pk10开奖结果_dfG0Rt pk10开奖结果_ojLfYJ pk10开奖结果_idKU8E pk10开奖结果_yBJ0hq pk10开奖结果_1DXgyL pk10开奖结果_tYSYcpM pk10开奖结果pk10开奖结果_hYSD1iE