详情

首页手游攻略 设计模式中的观察者模式在Ruby编程中的运用实例解析实用指南

设计模式中的观察者模式在Ruby编程中的运用实例解析实用指南

佚名 2026-09-03 17:30:02

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“设计模式中的观察者模式在Ruby编程中的运用实例解析”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

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

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

落到代码里,通俗点说就是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方法是无效的。

您可能感兴趣的文章:
  • 实例解析Ruby设计模式开发中对观察者模式的实现
  • 深入剖析Ruby设计模式编程中对命令模式的相关采用
  • Ruby设计模式编程中对外观模式的应用实例分析
  • 详解组合模式的结构及其在Ruby设计模式编程中的运用
  • 设计模式中的模板方法模式在Ruby中的应用实例两则
  • 实例解析Ruby设计模式编程中Strategy策略模式的采用
  • 实例讲解Ruby采用设计模式中的装饰器模式的方法
  • Ruby设计模式编程中采用Builder建造者模式的实例
  • 详解Ruby设计模式编程中对单例模式的运用
  • Ruby设计模式编程之适配器模式实战攻略
  • Ruby采用设计模式中的代理模式与装饰模式的代码实例
  • Ruby中采用设计模式中的轻松工厂模式和工厂方法模式
  • 解析proxy代理模式在Ruby设计模式开发中的运用
点击查看更多
推荐专题
热门阅读