title, salary) @name = name @title = title @salary = salary end end class Payroll def update(changed_employee) puts("#{changed_employee.name} получил повышение зарплаты!") puts("Его зарплата теперь составляет #{changed_employee.salary}!") end end ivan = Employee.new("Иван Иванов", "Оператор крана", 30000.0) # Повысить Ивану зарплату. ivan.salary=35000.0
name, title, salary, payroll) @name = name @title = title @salary = salary @payroll = payroll end def salary=(new_salary) @salary = new_salary @payroll.update(self) end end
@title = title @salary = salary @observers = [] end def salary=(new_salary) @salary = new_salary notify_observers end def notify_observers @observers.each do |observer| observer.update(self) end end
<< observer end def delete_observer(observer) @observers.delete(observer) end def notify_observers @observers.each do |observer| observer.update(self) end end end
def initialize( name, title, salary) super() @name = name @title = title @salary = salary end def salary=(new_salary) @salary = new_salary notify_observers end end
<< observer end def delete_observer(observer) @observers.delete(observer) end def notify_observers @observers.each do |observer| observer.update(self) end end end
def initialize( name, title, salary) super() @name = name @title = title @salary = salary end def salary=(new_salary) @salary = new_salary notify_observers end end
объектов, не создавая при этом мешанину из кода, организующего взаимосвязь между ними. Большинство кода реализуется на стороне «наблюдаемого» объекта. Интерфейс между наблюдателем и наблюдаемым объектом может быть любой сложности, но если наблюдатели достаточно просты их легко можно реализовать в Ruby-style с помощью блоков.
def get_time_required 1.0 # 1 минута на добавление муки и сахара. end end class MixTask < Task def initialize super('Замесить.') end def get_time_required 3.0 # Замешивать 3 минуты. end end
= [] add_sub_task( AddDryIngredientsTask.new ) add_sub_task( AddLiquidsTask.new ) add_sub_task( MixTask.new ) end def add_sub_task(task) @sub_tasks << task end def remove_sub_task(task) @sub_tasks.delete(task) end def get_time_required @sub_tasks.inject(0.0) do |res, task| res += task.get_time_required res end end end
[] end def add_sub_task(task) @sub_tasks << task end def remove_sub_task(task) @sub_tasks.delete(task) end def get_time_required @sub_tasks.inject(0.0) do |res, task| res += task.get_time_required res end end end
создавать деревья объектов неограниченной глубины, в которых можно работать как с отдельными объектами, так и с их совокупностями. Довольно часто используется в библиотеках построения графических интерфейсов.
В классе реализовать метод def push(int), который добавляет целое число к массиву внутри объекта MyArray. С помощью паттерна Observer создать 3 наблюдателя, которые получают информацию о том, что состав массива внутри MyArray обновился и соответственно пересчитывают и сохраняют внутри себя обновлённую информацию о сумме элементов массива, произведении элементов массива и их среднем арифметическом.
слова. В качестве атомарных задач реализовать несколько «фильтров»: выборка всех числовых элементов массива; выборка всех строковых элементов массива; возведение всех численных элементов массива в квадрат; «разворот» всех строковых элементов массива задом наперёд. Используя паттерн Composite, реализовать систему, позволяющую конструировать из базовых фильтров различные составные, сложные фильтры, объединяющие базовые фильтры в различных комбинациях. Реализовать возможность конструирования фильтров, используя синтаксис массивов (<<, [], []=).