Date post: | 03-Aug-2015 |
Category: |
Technology |
Upload: | russolsen |
View: | 258 times |
Download: | 0 times |
22Template Method
Document!def render render_title(title) text.each_line do|l| render_line(l) end ...
PlainDocumentdef render_title(t) end !def render_line(l) end
HtmlDocumentdef render_title(t) end !def render_line(l) end
# I start off fine!
doc1 = HtmlDocument.new(…)
# But then I need to render doc1 in plain text…
doc2 = PlainDocument.new(doc1.title, doc1.text)
doc2.render
30
33Strategy
Document
def render @renderer.render(self) end
HtmlRendererdef render(doc) puts “<title>” puts @doc.title puts “</title>” … end
PlainRendererdef render(doc) puts doc.title ... end
34Strategy
Document
def render @renderer.render(self) end
HtmlRendererdef render(doc) puts “<title>” puts @doc.title puts “</title>” … end
PlainRenderdef render(doc) puts doc.title ... end
40Observer Pattern
Document
def text=(t) @observers.each {…} end
Viewdef on_doc_change(doc) puts “<title>” puts @doc.title puts “</title>” … end
Databasedef on_doc_change(doc) # Save the doc ... end
Big Ideas 1) Abstractions!
2) Separate out change
3) Composition not inheritance
4) Interface not implementation
46
52Strategy
Document
def render @renderer.render(self) end
HtmlRendererdef render(doc) puts “<title>” puts @doc.title puts “</title>” … end
PlainRenderdef render(doc) puts doc.title ... end
54
RendererDocument
HtmlRenderer PlainRenderer
Observer
Observer
Observer
Observer
Strategy + Insanity
Big Ideas 1) Abstractions!
2) Separate out change
3) Composition not inheritance
4) Interface not implementation
5) Pain first, then the pattern56
59Template Method
Document!def render render_title(title) text.each_line do|l| render_line(l) end ...
PlainDocumentdef render_title(t) end !def render_line(l) end
HtmlDocumentdef render_title(t) end !def render_line(l) end
60Strategy
Document
def render @renderer.render(self) end
HtmlRendererdef render(doc) puts “<title>” puts @doc.title puts “</title>” … end
PlainRenderdef render(doc) puts doc.title ... end
61Observer Pattern
Document
def text=(t) @observers.each {…} end
Viewdef on_doc_change(doc) puts “<title>” puts @doc.title puts “</title>” … end
Databasedef on_doc_change(doc) # Save the doc ... end
Big Ideas 1) Abstractions!
2) Separate out change
3) Composition not inheritance
4) Interface not implementation
5) Pain first, then the pattern62