Jump to content

Visitor pattern: Difference between revisions

m (→‎{{header|Raku}}: use a proper wikilink for Wikipedia)
Line 34:
* [https://www.codeproject.com/Articles/588882/TheplusVisitorplusPatternplusExplained Code Project - The Visitor Pattern Explained]
<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}}==
7,806

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.