在一个现实生活中的使用中,后记发电机类具有“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类自动保存和恢复的字体,但它不是必要进入那些看到一个堆栈的价值。
是的 - 先使用堆栈深度。你知道你首先使用广度排队吗? – RichardOD 2010-01-13 16:08:48
这不是一个真正的.net特定问题。堆栈是一种抽象的数据类型,人们在(可能)每种语言中使用它们。 – 2010-01-13 16:20:42
我一直在使用堆栈。你可以在必要时使用它们。 – 2010-01-13 16:55:56