Visitor pattern: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (→{{header|Raku}}: use a proper wikilink for Wikipedia) |
|||
Line 34: | Line 34: | ||
* [https://www.codeproject.com/Articles/588882/TheplusVisitorplusPatternplusExplained Code Project - The Visitor Pattern Explained] |
* [https://www.codeproject.com/Articles/588882/TheplusVisitorplusPatternplusExplained Code Project - The Visitor Pattern Explained] |
||
<br> |
<br> |
||
=={{header|Phix}}== |
|||
Quote of the day: Object oriented programs are offered as alternatives to correct ones... - Edsger Dijkstra<br> |
|||
Completely beyond me why anyone would actually want(/need) this sort of nonsense, but there's nothing at all difficult here. |
|||
<!--<syntaxhighlight lang="phix">(notonline)--> |
|||
<span style="color: #008080;">without</span> <span style="color: #008080;">javascript_semantics</span> |
|||
<span style="color: #008080;">abstract</span> <span style="color: #008080;">class</span> <span style="color: #000000;">CarElement</span> |
|||
<span style="color: #008080;">public</span> <span style="color: #004080;">string</span> <span style="color: #000000;">name</span> |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">Accept</span><span style="color: #0000FF;">()</span> |
|||
<span style="color: #7060A8;">throw</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Derived classes *MUST* implement this"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">class</span> |
|||
<span style="color: #008080;">abstract</span> <span style="color: #008080;">class</span> <span style="color: #000000;">Visitable</span> |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">Visit</span><span style="color: #0000FF;">(</span><span style="color: #000000;">CarElement</span> <span style="color: #000000;">e</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #7060A8;">throw</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Derived classes *MUST* implement this"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">class</span> |
|||
<span style="color: #008080;">class</span> <span style="color: #000000;">CarPart</span> <span style="color: #008080;">extends</span> <span style="color: #000000;">CarElement</span> |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">Accept</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Visitable</span> <span style="color: #000000;">visitor</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #000000;">visitor</span><span style="color: #0000FF;">.</span><span style="color: #000000;">Visit</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">this</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">class</span> |
|||
<span style="color: #008080;">class</span> <span style="color: #000000;">Body</span> <span style="color: #008080;">extends</span> <span style="color: #000000;">CarPart</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">class</span> |
|||
<span style="color: #008080;">class</span> <span style="color: #000000;">Engine</span> <span style="color: #008080;">extends</span> <span style="color: #000000;">CarPart</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">class</span> |
|||
<span style="color: #008080;">class</span> <span style="color: #000000;">Wheel</span> <span style="color: #008080;">extends</span> <span style="color: #000000;">CarPart</span> |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">Wheel</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">name</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #7060A8;">this</span><span style="color: #0000FF;">.</span><span style="color: #000000;">name</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">name</span> <span style="color: #0000FF;">&</span> <span style="color: #008000;">" wheel"</span> |
|||
<span style="color: #008080;">return</span> <span style="color: #7060A8;">this</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">class</span> |
|||
<span style="color: #008080;">class</span> <span style="color: #000000;">Car</span> <span style="color: #008080;">extends</span> <span style="color: #000000;">CarPart</span> |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">elements</span> |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">Car</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">name</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #7060A8;">this</span><span style="color: #0000FF;">.</span><span style="color: #000000;">name</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">name</span> |
|||
<span style="color: #000000;">elements</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #7060A8;">new</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Wheel</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"front left"</span><span style="color: #0000FF;">}),</span> |
|||
<span style="color: #7060A8;">new</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Wheel</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"front right"</span><span style="color: #0000FF;">}),</span> |
|||
<span style="color: #7060A8;">new</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Wheel</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"back left"</span><span style="color: #0000FF;">}),</span> |
|||
<span style="color: #7060A8;">new</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Wheel</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"back right"</span><span style="color: #0000FF;">}),</span> |
|||
<span style="color: #7060A8;">new</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Body</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"body"</span><span style="color: #0000FF;">}),</span> |
|||
<span style="color: #7060A8;">new</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Engine</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"engine"</span><span style="color: #0000FF;">})}</span> |
|||
<span style="color: #008080;">return</span> <span style="color: #7060A8;">this</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">Accept</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Visitable</span> <span style="color: #000000;">visitor</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #000000;">CarElement</span> <span style="color: #000000;">element</span> |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">element</span> <span style="color: #008080;">in</span> <span style="color: #000000;">elements</span> <span style="color: #008080;">do</span> |
|||
<span style="color: #000000;">element</span><span style="color: #0000FF;">.</span><span style="color: #000000;">Accept</span><span style="color: #0000FF;">(</span><span style="color: #000000;">visitor</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #000000;">visitor</span><span style="color: #0000FF;">.</span><span style="color: #000000;">Visit</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">this</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">class</span> |
|||
<span style="color: #008080;">class</span> <span style="color: #000000;">CarElementPrintVisitor</span> <span style="color: #008080;">extends</span> <span style="color: #000000;">Visitable</span> |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">Visit</span><span style="color: #0000FF;">(</span><span style="color: #000000;">CarElement</span> <span style="color: #000000;">e</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Visiting %s.\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">e</span><span style="color: #0000FF;">.</span><span style="color: #000000;">name</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">class</span> |
|||
<span style="color: #008080;">class</span> <span style="color: #000000;">CarElementDoVisitor</span> <span style="color: #008080;">extends</span> <span style="color: #000000;">Visitable</span> |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">Visit</span><span style="color: #0000FF;">(</span><span style="color: #000000;">CarElement</span> <span style="color: #000000;">e</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">verb</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">Body</span><span style="color: #0000FF;">(</span><span style="color: #000000;">e</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #000000;">verb</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"Moving"</span> |
|||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">Car</span><span style="color: #0000FF;">(</span><span style="color: #000000;">e</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">or</span> <span style="color: #000000;">Engine</span><span style="color: #0000FF;">(</span><span style="color: #000000;">e</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #000000;">verb</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"Starting"</span> |
|||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">Wheel</span><span style="color: #0000FF;">(</span><span style="color: #000000;">e</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #000000;">verb</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"Kicking"</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s my %s.\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">verb</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e</span><span style="color: #0000FF;">.</span><span style="color: #000000;">name</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">class</span> |
|||
<span style="color: #000000;">Car</span> <span style="color: #000000;">car</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">new</span><span style="color: #0000FF;">({</span><span style="color: #008000;">"car"</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #000000;">car</span><span style="color: #0000FF;">.</span><span style="color: #000000;">Accept</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">new</span><span style="color: #0000FF;">(</span><span style="color: #000000;">CarElementPrintVisitor</span><span style="color: #0000FF;">))</span> |
|||
<span style="color: #000000;">car</span><span style="color: #0000FF;">.</span><span style="color: #000000;">Accept</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">new</span><span style="color: #0000FF;">(</span><span style="color: #000000;">CarElementDoVisitor</span><span style="color: #0000FF;">))</span> |
|||
<!--</syntaxhighlight>--> |
|||
{{out}} |
|||
<pre> |
|||
Visiting front left wheel. |
|||
Visiting front right wheel. |
|||
Visiting back left wheel. |
|||
Visiting back right wheel. |
|||
Visiting body. |
|||
Visiting engine. |
|||
Visiting car. |
|||
Kicking my front left wheel. |
|||
Kicking my front right wheel. |
|||
Kicking my back left wheel. |
|||
Kicking my back right wheel. |
|||
Moving my body. |
|||
Starting my engine. |
|||
Starting my car. |
|||
</pre> |
|||
=={{header|Raku}}== |
=={{header|Raku}}== |