
Ruby 中介者模式讲解和代码示例
中介者是一种行为设计模式, 让程序组件通过特殊的中介者对象进行间接沟通, 达到减少组件之间依赖关系的目的。
中介者能使得程序更易于修改和扩展, 而且能更方便地对独立的组件进行复用, 因为它们不再依赖于很多其他的类。
复杂度:
流行度:
使用示例: 中介者模式在 Ruby 代码中最常用于帮助程序 GUI 组件之间的通信。 在 MVC 模式中, 控制器是中介者的同义词。
概念示例
本例说明了中介者设计模式的结构并重点回答了下面的问题:
- 它由哪些类组成?
- 这些类扮演了哪些角色?
- 模式中的各个元素会以何种方式相互关联?
main.rb: 概念示例
# The Mediator interface declares a method used by components to notify the # mediator about various events. The Mediator may react to these events and pass # the execution to other components. class Mediator # @abstract # # @param [Object] sender # @param [String] event def notify(_sender, _event) raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'" end end class ConcreteMediator < Mediator # @param [Component1] component1 # @param [Component2] component2 def initialize(component1, component2) @component1 = component1 @component1.mediator = self @component2 = component2 @component2.mediator = self end # @param [Object] sender # @param [String] event def notify(_sender, event) if event == 'A' puts 'Mediator reacts on A and triggers following operations:' @component2.do_c elsif event == 'D' puts 'Mediator reacts on D and triggers following operations:' @component1.do_b @component2.do_c end end end # The Base Component provides the basic functionality of storing a mediator's # instance inside component objects. class BaseComponent # @return [Mediator] attr_accessor :mediator # @param [Mediator] mediator def initialize(mediator = nil) @mediator = mediator end end # Concrete Components implement various functionality. They don't depend on # other components. They also don't depend on any concrete mediator classes. class Component1 < BaseComponent def do_a puts 'Component 1 does A.' @mediator.notify(self, 'A') end def do_b puts 'Component 1 does B.' @mediator.notify(self, 'B') end end class Component2 < BaseComponent def do_c puts 'Component 2 does C.' @mediator.notify(self, 'C') end def do_d puts 'Component 2 does D.' @mediator.notify(self, 'D') end end # The client code. c1 = Component1.new c2 = Component2.new ConcreteMediator.new(c1, c2) puts 'Client triggers operation A.' c1.do_a puts "\n" puts 'Client triggers operation D.' c2.do_d
output.txt: 执行结果
Client triggers operation A. Component 1 does A. Mediator reacts on A and triggers following operations: Component 2 does C. Client triggers operation D. Component 2 does D. Mediator reacts on D and triggers following operations: Component 1 does B. Component 2 does C.