В одном реальном использовании класс генератора postscript имеет состояние «current_font», используемое в качестве шрифта для любых операций, которые рисуют текст. Иногда функции необходимо временно установить шрифт, но затем вернуть его к тому, что было. Мы можем просто использовать временную переменную для сохранения и восстановления шрифта:
def draw_body
old_font = ps.get_font
ps.set_font('Helvetica 10')
draw_top_section
draw_bottom_section
ps.set_font(old_font)
end
Но в третий раз, когда вы это сделаете, вы захотите перестать повторяться. Итак, давайте позволим объекту ps сохранить и восстановить шрифт для нас:
class PS
def save_font
old_font = get_font
end
def restore_font
set_font(old_font)
end
end
Теперь абонент становится:
def draw_body
ps.save_font
ps.set_font('Helvetica 10')
draw_top_section
draw_bottom_section
ps.restore_font
end
Это прекрасно работает, пока мы не используем тот же шаблон внутри одной из подпрограмм, вызываемых draw_page:
def draw_top_section
ps.save_font
ps.set_font('Helvetica-bold 14')
# draw the title
ps.restore_font
# draw the paragraph
end
Когда draw_top_section вызывает "save_font", он перекрывает шрифт, который был сохранен draw_page. Пришло время использовать стек:
def PS
def push_font
font_stack.push(get_font)
end
def pop_font
set_font(font_stack.pop)
end
end
А в звонящих:
def draw_top_section
ps.push_font
ps.set_font('Helvetica-bold 14')
# draw the title
ps.pop_font
# draw the body
end
Возможны дальнейшие усовершенствования, такие как автоматическое сохранение и восстановление шрифта в классе PS, но не обязательно заходить в них, чтобы увидеть значение стека.