作者godfat (godfat 真常)
看板Ruby
标题Re: [问题] 一个MVC pattern和composite pattern的 …
时间Fri Oct 12 22:42:07 2007
edit typo
※ 引述《jackace (inevitable......)》之铭言:
: 抱歉喔 我可能没叙述的很好 我是用ruby没错...
: 我的结构是这样:
: class Content
: end
: class Section < Content
: def initialize(title)
: @items = Array.new
: @title = title
: end
: end
: class Text < Content
: def initialize(text)
: @text=text
: end
: end
: 那个Section.items放的是任何的Content 所以可以是Section或Text
: 这样应该就是composite pattern....吧??? 我刚学DP不太确定是不是这样叫
这个...我是觉得不是这样说的,因为你这边 @items 可以放 Section 或 Text,
跟 static typing 下以 interface 达到的 composite pattern 完全无关,
这边纯粹是 ruby dynamic typing 下的结果。
anyway, 名词不重要,反正我现在知道你要做什麽了...
: 那我在View 里面要从最顶层的Section开始往下traverse
: 比如说遇到Section的时候要用粗体把Section的title印出来
: 遇到Text的时候要印text
: 那要怎麽避免if(instance_of?)的写法??
不想把 display 写到 model 中,那考虑 visitor pattern?
class DisplayVisitor
def visit_section section
"<strong>#{section.content}</strong>"
end
def visit_text text
text.content
end
end
class Content
def accept visitor
NotImplementedError.new 'please override this method.'
end
end
class Section < Content
def accept visitor
visitor.visit_section self
end
end
class Text < Content
def acceot visitor
visitor.visit_text self
end
end
用法就会是:
Section.accept DisplayVisitor.new
Section.accept FadeOutVisitor.new
诸如此类。
嫌麻烦?ruby 厉害之处就在此啦...
class Content
def accept visitor
visitor.send "visit_#{self.class.to_s.downcase}", self
end
end
class Section < Content; end
class Text < Content; end
於是你的 display 就写在 visitor 里面了。
如果还是嫌不应该全部挤在 visitor 里,再善用 mixin 吧 :p
class DisplayVisitor
include TextDisplayer
include SectionDisplayer
end
要多打很多次很烦?再来 meta-programming...
不过这次我不写范例了 :o
--
「行け!Loki!」
(rocky ロッキー)
-Gurumin ぐるみん 王子? XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.28.18
※ 编辑: godfat 来自: 220.135.28.18 (10/12 22:45)
1F:推 jackace:大感恩 10/12 23:32