<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?action=history&amp;feed=atom&amp;title=Programa%C3%A7%C3%A3o_com_Objectos%2FTeste_de_2011%2F01%2F10</id>
	<title>Programação com Objectos/Teste de 2011/01/10 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?action=history&amp;feed=atom&amp;title=Programa%C3%A7%C3%A3o_com_Objectos%2FTeste_de_2011%2F01%2F10"/>
	<link rel="alternate" type="text/html" href="https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;action=history"/>
	<updated>2026-05-10T16:33:08Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;diff=10961&amp;oldid=prev</id>
		<title>Root: Redirected page to ist:Programação com Objectos/Teste de 2011/01/10</title>
		<link rel="alternate" type="text/html" href="https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;diff=10961&amp;oldid=prev"/>
		<updated>2018-11-07T17:32:51Z</updated>

		<summary type="html">&lt;p&gt;Redirected page to &lt;a href=&quot;https://web.tecnico.ulisboa.pt/~david.matos/w/pt/index.php/Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&quot; class=&quot;extiw&quot; title=&quot;ist:Programação com Objectos/Teste de 2011/01/10&quot;&gt;ist:Programação com Objectos/Teste de 2011/01/10&lt;/a&gt;&lt;/p&gt;
&lt;a href=&quot;https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;amp;diff=10961&amp;amp;oldid=5004&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;diff=5004&amp;oldid=prev</id>
		<title>Root: moved Programação com Objectos - Teste de 2011/01/10 to Programação com Objectos/Teste de 2011/01/10</title>
		<link rel="alternate" type="text/html" href="https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;diff=5004&amp;oldid=prev"/>
		<updated>2013-11-18T13:24:55Z</updated>

		<summary type="html">&lt;p&gt;moved &lt;a href=&quot;/~david/w/pt/Programa%C3%A7%C3%A3o_com_Objectos_-_Teste_de_2011/01/10&quot; class=&quot;mw-redirect&quot; title=&quot;Programação com Objectos - Teste de 2011/01/10&quot;&gt;Programação com Objectos - Teste de 2011/01/10&lt;/a&gt; to &lt;a href=&quot;/~david/w/pt/Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&quot; class=&quot;mw-redirect&quot; title=&quot;Programação com Objectos/Teste de 2011/01/10&quot;&gt;Programação com Objectos/Teste de 2011/01/10&lt;/a&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:24, 18 November 2013&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;diff=3808&amp;oldid=prev</id>
		<title>Root at 20:14, 28 January 2011</title>
		<link rel="alternate" type="text/html" href="https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;diff=3808&amp;oldid=prev"/>
		<updated>2011-01-28T20:14:18Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;amp;diff=3808&amp;amp;oldid=3803&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;diff=3803&amp;oldid=prev</id>
		<title>Root: /* 2.6.2. Exercício de programação (Apoio Humanitário) */</title>
		<link rel="alternate" type="text/html" href="https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;diff=3803&amp;oldid=prev"/>
		<updated>2011-01-17T12:18:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;2.6.2. Exercício de programação (Apoio Humanitário)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 12:18, 17 January 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l269&quot;&gt;Line 269:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 269:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Image:PO-20110110-class.png]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Image:PO-20110110-class.png]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===2.6.2. Exercício de programação &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(Apoio Humanitário) &lt;/del&gt;===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===2.6.2. Exercício de programação ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Usa-se o padrão State como forma de abstrair o comportamento dependente da idade do cliente.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Usa-se o padrão State como forma de abstrair o comportamento dependente da idade do cliente.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;diff=3800&amp;oldid=prev</id>
		<title>Root: /* Resolução da Parte 2 */</title>
		<link rel="alternate" type="text/html" href="https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;diff=3800&amp;oldid=prev"/>
		<updated>2011-01-17T12:16:38Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Resolução da Parte 2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;a href=&quot;https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;amp;diff=3800&amp;amp;oldid=3798&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;diff=3798&amp;oldid=prev</id>
		<title>Root at 11:51, 17 January 2011</title>
		<link rel="alternate" type="text/html" href="https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;diff=3798&amp;oldid=prev"/>
		<updated>2011-01-17T11:51:53Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 11:51, 17 January 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l2&quot;&gt;Line 2:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 2:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Parte 1 (resposta múltipla) ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Parte 1 (resposta múltipla) ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Image:UML-teste-po-&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;20100121&lt;/del&gt;.png|frame|right| Figura 1]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Image:UML-teste-po-&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;20110110&lt;/ins&gt;.png|frame|right| Figura 1]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;'''1.1.''' Considere o diagrama UML da figura 1 (à direita). Qual das seguintes afirmações está correcta?&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;'''1.1.''' Considere o diagrama UML da figura 1 (à direita). Qual das seguintes afirmações está correcta?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#doThat pode ser invocado através de referências para I&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#doThat pode ser invocado através de referências para I&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l153&quot;&gt;Line 153:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 153:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Chave da Parte 1 ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Chave da Parte 1 ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Image:UML-teste-po-&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;20100121&lt;/del&gt;.png|frame|right| Figura 1]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Image:UML-teste-po-&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;20110110&lt;/ins&gt;.png|frame|right| Figura 1]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;'''1.1.''' Considere o diagrama UML da figura 1 (à direita). Qual das seguintes afirmações está correcta?&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;'''1.1.''' Considere o diagrama UML da figura 1 (à direita). Qual das seguintes afirmações está correcta?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#&amp;lt;s&amp;gt;doThat pode ser invocado através de referências para I&amp;lt;/s&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#&amp;lt;s&amp;gt;doThat pode ser invocado através de referências para I&amp;lt;/s&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;diff=3797&amp;oldid=prev</id>
		<title>Root at 11:50, 17 January 2011</title>
		<link rel="alternate" type="text/html" href="https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;diff=3797&amp;oldid=prev"/>
		<updated>2011-01-17T11:50:24Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;amp;diff=3797&amp;amp;oldid=3796&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;diff=3796&amp;oldid=prev</id>
		<title>Root: New page: {{TOCright}} == Parte 1 (resposta múltipla) ==   Figura 1 '''1.1.''' Considere o diagrama UML da figura 1 (à direita). Qual das seguintes ...</title>
		<link rel="alternate" type="text/html" href="https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2011/01/10&amp;diff=3796&amp;oldid=prev"/>
		<updated>2011-01-17T11:43:59Z</updated>

		<summary type="html">&lt;p&gt;New page: {{TOCright}} == Parte 1 (resposta múltipla) ==  &lt;a href=&quot;/~david/w/pt/File:UML-teste-po-20100121.png&quot; title=&quot;File:UML-teste-po-20100121.png&quot;&gt;frame|right| Figura 1&lt;/a&gt; &amp;#039;&amp;#039;&amp;#039;1.1.&amp;#039;&amp;#039;&amp;#039; Considere o diagrama UML da figura 1 (à direita). Qual das seguintes ...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{TOCright}}&lt;br /&gt;
== Parte 1 (resposta múltipla) ==&lt;br /&gt;
&lt;br /&gt;
[[Image:UML-teste-po-20100121.png|frame|right| Figura 1]]&lt;br /&gt;
'''1.1.''' Considere o diagrama UML da figura 1 (à direita). Qual das seguintes afirmações está correcta?&lt;br /&gt;
:#doThat pode ser invocado através de referências para I&lt;br /&gt;
:#doThat não está definido para B&lt;br /&gt;
:#doIt pode ser invocado através de referências para C&lt;br /&gt;
:#A implementa I&lt;br /&gt;
:#A é uma classe derivada de C&lt;br /&gt;
&lt;br /&gt;
'''1.2.''' Que padrão de desenho permite especificar numa classe o esqueleto de um algoritmo, deixando para as subclasses a concretização dos seus passos?&lt;br /&gt;
:#Strategy&lt;br /&gt;
:#Bridge&lt;br /&gt;
:#Template Method&lt;br /&gt;
:#Visitor&lt;br /&gt;
:#State&lt;br /&gt;
&lt;br /&gt;
'''1.3.''' Em Java, qual das seguintes frases está correcta?&lt;br /&gt;
:#todas as classes são derivadas de java.lang.Class&lt;br /&gt;
:#uma classe interna não pode ser anónima&lt;br /&gt;
:#uma classe anónima pode implementar uma interface&lt;br /&gt;
:#java.lang.Object contém os métodos que permitem definir a ordem por omissão entre quaisquer objectos&lt;br /&gt;
:#uma classe abstracta pode ser instanciada se definir construtores&lt;br /&gt;
&lt;br /&gt;
'''1.4.''' Em Java, um construtor...&lt;br /&gt;
:#não pode chamar outros construtores&lt;br /&gt;
:#não pode chamar funções static&lt;br /&gt;
:#chama sempre o construtor da superclasse&lt;br /&gt;
:#não pode ser privado&lt;br /&gt;
:#não pode declarar variáveis locais&lt;br /&gt;
&lt;br /&gt;
'''1.5.''' Em Java, as classes internas...&lt;br /&gt;
:#não podem ser serializáveis (i.e., não podem implementar java.io.Serializable)&lt;br /&gt;
:#não podem conter métodos que lancem excepções&lt;br /&gt;
:#podem ser instanciadas dentro de qualquer bloco de uma função&lt;br /&gt;
:#constituem um mecanismo para uso exclusivo do tratamento de excepções&lt;br /&gt;
:#não podem ter métodos públicos&lt;br /&gt;
&lt;br /&gt;
'''1.6.''' Em Java, o método equals...&lt;br /&gt;
:#não está disponível nas classes da package java.util&lt;br /&gt;
:#é utilizado para definir ordem entre as instâncias de uma classe&lt;br /&gt;
:#está disponível apenas para classes que implementem  java.io.Serializable&lt;br /&gt;
:#permite comparar apenas objectos com outros da mesma classe&lt;br /&gt;
:#permite comparar dois objectos de qualquer tipo&lt;br /&gt;
&lt;br /&gt;
'''1.7.''' Em Java, a interface java.lang.Comparable ...&lt;br /&gt;
:#é implementada pela classe java.lang.Object&lt;br /&gt;
:#as instâncias das suas implementações podem ser utilizadas como chaves pela classe java.util.TreeMap&lt;br /&gt;
:#uma classe não deve implementá-la se quiser que as suas instâncias sejam serializáveis&lt;br /&gt;
:#só é relevante para classes que implementem java.util.List&lt;br /&gt;
:#as respostas anteriores estão erradas&lt;br /&gt;
&lt;br /&gt;
'''1.8.''' Relativamente aos padrões de desenho State e Strategy...&lt;br /&gt;
:#ambos especificam a delegação de acções em objectos usados pelo cliente&lt;br /&gt;
:#as estratégias têm de ser fixadas na altura da criação do cliente, mas os estados não&lt;br /&gt;
:#são idênticos, mas as classes que implementam as estratégias são em número fixo&lt;br /&gt;
:#gerem as dependências de objectos das suas implementações&lt;br /&gt;
:#tratam da mesma forma objectos individuais e suas agregações&lt;br /&gt;
&lt;br /&gt;
'''1.9.''' O padrão de desenho Decorator...&lt;br /&gt;
:#permite adicionar funcionalidade a um objecto sem alterar a sua interface&lt;br /&gt;
:#não pode ser aplicado em conjunto com padrão Visitor&lt;br /&gt;
:#permite ajustar a interface e o comportamento de um objecto&lt;br /&gt;
:#permite aplicar uma operação a uma estrutura de objectos&lt;br /&gt;
:#permite estabelecer o esqueleto de um algoritmo&lt;br /&gt;
&lt;br /&gt;
'''1.10.''' O padrão de desenho Abstract Factory...&lt;br /&gt;
:#representa a construção de uma colecção&lt;br /&gt;
:#gerir as dependências de outros objectos relativamente ao estado de um objecto&lt;br /&gt;
:#permite abstrair a criação de famílias de objectos para uma aplicação&lt;br /&gt;
:#permite tratar famílias de objectos e seus grupos indiscriminadamente&lt;br /&gt;
:#permite que o comportamento de um objecto mude quando o seu estado muda&lt;br /&gt;
&lt;br /&gt;
== Parte 2 ==&lt;br /&gt;
&lt;br /&gt;
'''2.1.''' (1.5 val.) Na linguagem Smalltalk, o método '''subclassResponsibility''' pode ser invocado por uma superclasse para indicar que a implementação de um determinado método é da responsabilidade de uma subclasse. Desse modo, se for usada uma subclasse que não implemente o método, o programa chama a versão da superclasse e recebe uma notificação da falta durante a execução. Qual é o mecanismo discutido acima e como é disponibilizado na linguagem Java? Diga quais são as suas vantagens relativas.&lt;br /&gt;
&lt;br /&gt;
'''2.2.''' (1.5 val.) O mecanismo de herança potencia o desenvolvimento incremental e a reutilização de funcionalidade existente. No entanto, apesar destes aspectos positivos, apresenta algumas limitações. Descreva algumas das limitações do mecanismo de herança (pode particularizar para Java) e em que medida a utilização de arquitecturas como as previstas em alguns padrões de desenho as minimizam.&lt;br /&gt;
&lt;br /&gt;
'''2.3.''' (1.5 val.) Descreva o padrão de desenho ''State'' e as vantagens da sua utilização. Explique em que medida o mecanismo de polimorfismo de inclusão é importante para a definição e funcionamento da arquitectura prevista pelo padrão. Dê um exemplo de utilização do padrão.&lt;br /&gt;
&lt;br /&gt;
'''2.4.''' (1.5 val.) O padrão de desenho ''Visitor'' permite abstrair a aplicação de uma operação a uma estrutura de objectos. Diga qual é o princípio de funcionamento do padrão e que vantagens apresenta a sua utilização. Quais são os problemas introduzidos pela utilização do padrão? Dê um exemplo de aplicação.&lt;br /&gt;
&lt;br /&gt;
'''2.5.1.''' (1.0 val.) Que resultado se obtém quando se executa o seguinte programa? (represente mudanças de linha com \n)&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
public abstract class Shell {&lt;br /&gt;
  protected Ghost _ghost;&lt;br /&gt;
  protected Shell(Ghost ghost) { &lt;br /&gt;
    _ghost = ghost;&lt;br /&gt;
    System.out.println(getClass().getName());&lt;br /&gt;
  }&lt;br /&gt;
  public abstract boolean isOperational();&lt;br /&gt;
  public abstract void powerOn();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Virtual extends Shell {&lt;br /&gt;
  public Virtual(Ghost ghost) { super(ghost); }&lt;br /&gt;
  public boolean isOperational() { return _ghost.isHappy(); }&lt;br /&gt;
  public void powerOn() { System.out.println(&amp;quot;always on: nothing to do&amp;quot;); }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Physical extends Shell {&lt;br /&gt;
  private boolean _poweredOn = false;&lt;br /&gt;
  public Physical(Ghost ghost) { super(ghost); powerOn(); }&lt;br /&gt;
  public boolean isOperational() { return _poweredOn &amp;amp;&amp;amp; _ghost.isHappy(); }&lt;br /&gt;
  public void powerOn() { _poweredOn = true; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class NotReadyException extends Exception {}&lt;br /&gt;
&lt;br /&gt;
public class ShellTester {&lt;br /&gt;
  public void assertOperational(Shell shell) throws NotReadyException {&lt;br /&gt;
    if (!shell.isOperational()) {&lt;br /&gt;
      throw new NotReadyException();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Ghost {&lt;br /&gt;
  String _name;&lt;br /&gt;
  public Ghost(String name) { _name = name; }&lt;br /&gt;
  public boolean isHappy() { return true; /* ghosts are happy */ }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Application {&lt;br /&gt;
  public static void main(String args[]) {&lt;br /&gt;
    Shell kusanagi = new Virtual(new Ghost(&amp;quot;草薙素子&amp;quot;));&lt;br /&gt;
    Shell batou = new Physical(new Ghost(&amp;quot;バトー&amp;quot;));&lt;br /&gt;
    ShellTester tester = new ShellTester();&lt;br /&gt;
    try { tester.assertOperational(kusanagi); }&lt;br /&gt;
    catch (NotReadyException e) { System.out.println(&amp;quot;Kusanagi not ready!&amp;quot;); }&lt;br /&gt;
    try { tester.assertOperational(batou); }&lt;br /&gt;
    catch (NotReadyException e) { System.out.println(&amp;quot;Batou not ready!&amp;quot;); }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.5.2.''' (0.5 val.) Que padrão de desenho é usado no programa?&lt;br /&gt;
&lt;br /&gt;
'''2.5.3.''' (1.5 val.) Desenhe o diagrama de sequência UML correspondente à execução do programa, incluindo as etapas de criação dos objectos. O diagrama de sequência deve conter os nomes das mensagens trocadas (não é necessário representar os argumentos dessas mensagens nem as de retorno; não é necessário explicitar o construtor de '''Shell''').&lt;br /&gt;
&lt;br /&gt;
'''2.6.''' (2.5 val.) Desenhe o diagrama de classes UML correspondente ao seguinte problema:&lt;br /&gt;
&lt;br /&gt;
Uma empresa especializou-se no fabrico de máquinas de lavar roupa e de máquinas de lavar loiça. A gestão é moderna, sendo as tarefas normalmente executadas pelos gestores (contratar funcionários, por exemplo) e distribuídas por todos os funcionários de forma rotativa. O conselho de gestão tem sempre um operário e um engenheiro.&lt;br /&gt;
&lt;br /&gt;
As máquinas de lavar roupa desta empresa caracterizam-se pela sua segurança, por forma a evitar acidentes com crianças. A máquina de lavar roupa tem os seguintes botões e sensores: botão “ligar/desligar” (evento “press” chama o método “power”); botão “abrir porta” (evento “press” chama método “open”); sensor “porta fechada” (evento “trigger” chama método “closed”). A máquina tem ainda um temporizador, uma cuba rotativa e uma caixa metálica.&lt;br /&gt;
&lt;br /&gt;
As máquinas de lavar loiça são muito semelhantes no hardware, sendo a principal diferença a ausência da cuba rotativa.&lt;br /&gt;
&lt;br /&gt;
A empresa é caracterizada pelo seu capital social, pelo número de máquinas vendidas e pelo número de funcionários. Os funcionários são caracterizados pelo seu vencimento. As máquinas de lavar loiça pelo preço e peso. As máquinas de lavar roupa pelo preço, peso e pelo número de rotações da cuba (centrifugação).&lt;br /&gt;
&lt;br /&gt;
Represente as classes (seus nomes, métodos e atributos). Indique também as relações de herança, associação e agregação.&lt;br /&gt;
&lt;br /&gt;
'''2.7.''' (1.5 val.) Desenhe o diagrama de sequência UML correspondente à execução do programa da pergunta 2.5, incluindo as etapas de criação dos objectos (ignore as linhas do programa assinaladas com //!2.7). O diagrama de sequência deve conter os nomes das mensagens trocadas (não é necessário representar os argumentos dessas mensagens nem as de retorno).&lt;br /&gt;
&lt;br /&gt;
'''2.8.''' (2.0 val.) Uma agência de apoio humanitário organiza a sua actuação em função dos seus beneficiários: regiões, povoações e indivíduos (uma região contém povoações e as povoações contêm indivíduos). Cada tipo de beneficiário regista o nível de apoio recebido (um valor inteiro). Este valor é utilizado pela agência para determinar quais as regiões, as povoações, ou os indivíduos mais carenciados. A agência sabe que as condições/necessidades de ajuda variam com o período do ano e em função de catástrofes. Como tal, o processo de cálculo e actualização deve ser suficientemente flexível para poder ser alterado conforme as necessidades e deve ser independente dos beneficiários, para evitar introduzir mais complexidade nas suas vidas.&lt;br /&gt;
&lt;br /&gt;
Considerando o exposto acima, a agência define um calculador de benefícios (designado genericamente por Calculator). A implementação mais simples (designada por Standard) contabiliza: para cada indivíduo, uma unidade de ajuda; para cada povoação, o somatório das ajudas aos indivíduos que a habitam; e, para cada região, o somatório dos valores da ajuda dadas às povoações que contém. Existe ainda o calculador para casos de catástrofe (designado por Emergency), que difere do Standard por contabilizar menos ajuda (apenas 75% do total) para povoações com mais de 100 indivíduos e menos ajuda (apenas 90% do total) para regiões com mais de 20 povoações.&lt;br /&gt;
&lt;br /&gt;
Implemente todos os conceitos. Considere que deve ser possível definir novas formas de cálculo sem necessitar alterar, nem os indivíduos, nem as povoações, nem as regiões.&lt;br /&gt;
&lt;br /&gt;
== Chave da Parte 1 ==&lt;br /&gt;
&lt;br /&gt;
[[Image:UML-teste-po-20100121.png|frame|right| Figura 1]]&lt;br /&gt;
'''1.1.''' Considere o diagrama UML da figura 1 (à direita). Qual das seguintes afirmações está correcta?&lt;br /&gt;
:#&amp;lt;s&amp;gt;doThat (definido em C) não pode ser chamado se o objecto for referenciado através do tipo B&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;B implementa I através de C&amp;lt;/s&amp;gt;&lt;br /&gt;
:#o método doIt pode ser invocado através de referências para C&lt;br /&gt;
:#&amp;lt;s&amp;gt;os métodos de A não podem ser invocados sobre instâncias de C&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;A é uma classe derivada de B&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''1.2.''' Como se designa a operação que permite que um tipo hierarquicamente superior seja usado para referir uma instância de um tipo dele derivado?&lt;br /&gt;
:#&amp;lt;s&amp;gt;polimorfismo&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;herança&amp;lt;/s&amp;gt;&lt;br /&gt;
:#upcasting&lt;br /&gt;
:#&amp;lt;s&amp;gt;downcasting&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;redefinição&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''1.3.''' Em Java, qual das seguintes frases está incorrecta?&lt;br /&gt;
:#&amp;lt;s&amp;gt;java.lang.Object pode referir qualquer objecto&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;uma classe anónima pode implementar uma interface&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;uma classe abstracta pode sempre definir construtores&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;java.util.Collection é uma especialização de java.util.Iterable&amp;lt;/s&amp;gt;&lt;br /&gt;
:#java.lang.Serializable declara os métodos que permitem escrever um objecto para um canal de saída&lt;br /&gt;
&lt;br /&gt;
'''1.4.''' Em Java, uma classe anónima...&lt;br /&gt;
:#&amp;lt;s&amp;gt;apenas define assinaturas de métodos&amp;lt;/s&amp;gt;&lt;br /&gt;
:#pode ter membros não públicos&lt;br /&gt;
:#&amp;lt;s&amp;gt;não pode ter membros privados&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;não pode ser instanciada&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;não pode implementar uma interface&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''1.5.''' Em Java, a classe java.io.Reader...&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite ler objectos “serializados” (i.e., instâncias de classes que implementem java.io.Serializable)&amp;lt;/s&amp;gt;&lt;br /&gt;
:#permite ler caracteres (texto)&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite ler bytes (dados binários)&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;não pode ser utilizada como tipo de atributos de outras classes&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;é um tipo primitivo&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''1.6.''' Em Java, o parâmetro E em java.util.Iterable&amp;lt;E&amp;gt;...&lt;br /&gt;
:#&amp;lt;s&amp;gt;é uma constante que especifica o limite superior para a iteração&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;é utilizado para definir o passo de iteração (i.e., quantos elementos se deve saltar – por omissão, é 1)&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite especificar o tipo do comparador de elementos (instância referida por java.util.Comparator&amp;lt;E&amp;gt;)&amp;lt;/s&amp;gt;&lt;br /&gt;
:#define tipo retornado pelo iterador correspondente&lt;br /&gt;
:#&amp;lt;s&amp;gt;não deve ser usado&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''1.7.''' Relativamente à interface java.util.Iterator, qual das seguintes frases está correcta?&lt;br /&gt;
:#&amp;lt;s&amp;gt;quando associado à interface de java.lang.Object, permite percorrer qualquer objecto&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;sendo uma interface para iteração, não pode ser implementada por qualquer classe&amp;lt;/s&amp;gt;&lt;br /&gt;
:#permite a definição de algoritmos abstractos baseados em iteração&lt;br /&gt;
:#&amp;lt;s&amp;gt;só é relevante quando se usam instâncias referenciáveis por java.util.Collection&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;define a política de comparação de elementos de uma colecção&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''1.8.''' O padrão de desenho State...&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite delegar comportamentos específicos em objectos que os encapsulam&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite adicionar responsabilidades a objectos individuais em tempo de execução&amp;lt;/s&amp;gt;&lt;br /&gt;
:#permite delegar comportamentos dependentes do estado de um objecto&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite gerir as dependências de outros objectos relativamente ao estado de um objecto&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite guardar o estado de um objecto num canal de saída, para posterior recuperação&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''1.9.''' O padrão de desenho Template Method...&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite adicionar funcionalidade a um objecto sem alterar a sua interface&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;deve ser utilizado quando o uso do mecanismo de herança não for conveniente&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite ajustar a interface e o comportamento de um objecto&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;define uma operação a aplicar a uma estrutura de objectos&amp;lt;/s&amp;gt;&lt;br /&gt;
:#estabelece que uma classe defina um algoritmo cujas partes devem ser implementadas pela subclasses&lt;br /&gt;
&lt;br /&gt;
'''1.10.''' O padrão de desenho Observer...&lt;br /&gt;
:#&amp;lt;s&amp;gt;representa uma operação a ser realizada sobre os elementos de uma estrutura de objectos&amp;lt;/s&amp;gt;&lt;br /&gt;
:#permite gerir as dependências de outros objectos relativamente ao estado de um objecto&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite abstrair o uso de grupos de objectos por uma aplicação&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite tratar famílias de objectos e seus grupos indiscriminadamente&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite que o comportamento de um objecto mude quando o seu estado muda&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resolução da Parte 2 ==&lt;br /&gt;
&lt;br /&gt;
===2.1. Classes Paramétricas e Polimorfismo  ===&lt;br /&gt;
&lt;br /&gt;
Aspectos importantes:&lt;br /&gt;
* Definição de uma classe estruturalmente independente do(s) tipo(s) manipulado(s) (os seus parâmetros).&lt;br /&gt;
* O polimorfismo implicado pelas relações de herança (inclusão) permite o uso de uma instância de uma subclasse onde se espera uma de uma superclasse. O polimorfismo paramétrico permite a definição de classes concretas que manipulam qualquer tipo (potencialmente com restrições), evitando a definição de relações de herança (dependência) relativamente a um tipo determinado (introduz restrições desnecessárias). Note-se que uma classe paramétrica pode participar em relações de herança/implementação e ser usada polimorficamente (inclusão) como qualquer outra (e.g., List&amp;lt;A&amp;gt; e ArrayList&amp;lt;A&amp;gt;). No entanto, casos como  ArrayList&amp;lt;Animal&amp;gt; e ArrayList&amp;lt;Gato&amp;gt; não estão relacionadas polimorficamente.&lt;br /&gt;
&lt;br /&gt;
===2.2. Visitor &amp;amp; Strategy  ===&lt;br /&gt;
&lt;br /&gt;
Aspectos importantes:&lt;br /&gt;
* Descrição da estrutura e funcionamento do Visitor&lt;br /&gt;
* Vantagens e inconvenientes&lt;br /&gt;
* Exemplos: geração de código num compilador a partir de uma árvore sintáctica; desenho de uma cena a partir de uma descrição abstracta; cálculo de impostos sobre uma estrutura composta. Em geral, situações em que uma operação a realizar sobre uma estrutura de objectos e suas folhas possa ser generalizada.&lt;br /&gt;
* Visitor vs. Strategy: embora ambos os padrões permitam encapsular algoritmos a realizar sobre estruturas &amp;quot;clientes&amp;quot;, tanto a estrutura como o modo de funcionamento são diferentes. No Strategy, apesar de ser possível definir múltiplas versões de um algoritmo, não é possível especializar a operação dependendo do tipo específico do objecto.&lt;br /&gt;
&lt;br /&gt;
===2.3. Abstract Factory ===&lt;br /&gt;
&lt;br /&gt;
Aspectos importantes:&lt;br /&gt;
* Descrição da estrutura e funcionamento do Abstract Factory&lt;br /&gt;
* Abstract Factory utiliza polimorfismo para permitir o intercâmbio de fábricas sem ser necessário alterar a aplicação cliente&lt;br /&gt;
* Exemplo: escola com professores, salas, alunos, etc.: a estrutura da escola é sempre a mesma, mas a parametrização definida pela fábrica altera o funcionamento (por produzir intervenientes diferentes)&lt;br /&gt;
&lt;br /&gt;
===2.4. Composite ===&lt;br /&gt;
&lt;br /&gt;
Aspectos importantes:&lt;br /&gt;
* Estrutura: uma superclasse define o conceito abstracto a manipular. As subclasses, tanto atómicas, como as composições de componentes, são tratadas indistintamente e apresentam a mesma interface. O processamento de uma composição faz-se pelo processamento iterativo dos seus elementos.&lt;br /&gt;
* Exemplo: Rebanhos e Ovelhas (relativamente, por exemplo, à operação tosquiar).&lt;br /&gt;
&lt;br /&gt;
===2.5.1. Saída do programa===&lt;br /&gt;
 A\nC\nB\nA\nC\n&lt;br /&gt;
&lt;br /&gt;
===2.5.2. Identificação do padrão de desenho utilizado===&lt;br /&gt;
&lt;br /&gt;
O padrão utilizado é o State (Ghost).&lt;br /&gt;
&lt;br /&gt;
===2.6. Diagrama de classes (UML) ===&lt;br /&gt;
&lt;br /&gt;
Esboço do diagrama de classes para o problema apresentado.&lt;br /&gt;
&lt;br /&gt;
[[Image:PO-20100121-class.png]]&lt;br /&gt;
&lt;br /&gt;
===2.7. Diagrama de sequência (UML)===&lt;br /&gt;
&lt;br /&gt;
Note-se que alguns objectos não indicam variáveis associadas (os resultados da criação desses objectos são imediatamente passados como argumentos de outros métodos).&lt;br /&gt;
&lt;br /&gt;
[[Image:PO-20100121-seq.png]]&lt;br /&gt;
&lt;br /&gt;
===2.8. Exercício de programação (Apoio Humanitário) ===&lt;br /&gt;
&lt;br /&gt;
Usa-se o padrão Visitor como forma de abstrair o cálculo da ajuda prestada.&lt;br /&gt;
&lt;br /&gt;
Definem-se quatro conceitos: o beneficiário abstracto (HelpTarget), e cada um dos concretos (Person, Village, Region).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Basic help target.&lt;br /&gt;
 */&lt;br /&gt;
public abstract class HelpTarget {&lt;br /&gt;
        /**&lt;br /&gt;
         * No actual value is returned in this case.&lt;br /&gt;
         *&lt;br /&gt;
         * @param calculator the visitor used to evaluate assistance.&lt;br /&gt;
         * @return help received by this target.&lt;br /&gt;
         */&lt;br /&gt;
        public double accept(Calculator calculator) { throw new UnsupportedOperationException(); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Individual.&lt;br /&gt;
 * We omitted the initialisation code.&lt;br /&gt;
 */&lt;br /&gt;
public class Person extends HelpTarget {&lt;br /&gt;
        /**&lt;br /&gt;
         * @see HelpTarget#accept(Calculator)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double accept(Calculator calculator) { return calculator.evalPerson(this); }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * A village has villagers (persons).&lt;br /&gt;
 * We omitted the initialisation code.&lt;br /&gt;
 */&lt;br /&gt;
public class Village extends HelpTarget {&lt;br /&gt;
        /**&lt;br /&gt;
         * The villagers in this village.&lt;br /&gt;
         */&lt;br /&gt;
        private ArrayList&amp;lt;Person&amp;gt; _villagers = new ArrayList&amp;lt;Person&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * Simple constructor for initialising the village with some villagers.&lt;br /&gt;
         */&lt;br /&gt;
        public Village() {&lt;br /&gt;
                int count = (int) (Math.random() * 100);&lt;br /&gt;
                for (int i = 0; i &amp;lt; count; i++) _villagers.add(new Person());&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @return size of village (number of villagers).&lt;br /&gt;
         */&lt;br /&gt;
        public int size() { return _villagers.size(); }&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @param index&lt;br /&gt;
         * @return a villager&lt;br /&gt;
         */&lt;br /&gt;
        public Person getVillager(int index) { return _villagers.get(index); }&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @see HelpTarget#accept(Calculator)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double accept(Calculator calculator) { return calculator.evalVillage(this); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * A region has villages.&lt;br /&gt;
 * We omitted the initialisation code.&lt;br /&gt;
 */&lt;br /&gt;
public class Region extends HelpTarget {&lt;br /&gt;
        /**&lt;br /&gt;
         * The villages in this region.&lt;br /&gt;
         */&lt;br /&gt;
        private ArrayList&amp;lt;Village&amp;gt; _villages = new ArrayList&amp;lt;Village&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * Simple constructor for initialising the region with some villages.&lt;br /&gt;
         */&lt;br /&gt;
        public Region() {&lt;br /&gt;
                int count = (int) (Math.random() * 100);&lt;br /&gt;
                for (int i = 0; i &amp;lt; count; i++) _villages.add(new Village());&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @return size of region (number of villages).&lt;br /&gt;
         */&lt;br /&gt;
        public int size() {return _villages.size(); }&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @param index&lt;br /&gt;
         * @return a village&lt;br /&gt;
         */&lt;br /&gt;
        public Village getVillage(int index) { return _villages.get(index); }&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @see HelpTarget#accept(Calculator)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double accept(Calculator calculator) { return calculator.evalRegion(this); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A classe Calculator define a interface de cálculo para cada conceito.&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * The Calculator visitor interface.&lt;br /&gt;
 */&lt;br /&gt;
public abstract class Calculator {&lt;br /&gt;
        /**&lt;br /&gt;
         * @param person&lt;br /&gt;
         * @return help received by this person.&lt;br /&gt;
         */&lt;br /&gt;
        public abstract double evalPerson(Person person);&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @param village&lt;br /&gt;
         * @return help received by this village.&lt;br /&gt;
         */&lt;br /&gt;
        public abstract double evalVillage(Village village);&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @param region&lt;br /&gt;
         * @return help received by this region.&lt;br /&gt;
         */&lt;br /&gt;
        public abstract double evalRegion(Region region);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O processo de cálculo simples é definido pela classe Standard.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * &amp;quot;Standard&amp;quot; help calculator.&lt;br /&gt;
 */&lt;br /&gt;
public class Standard extends Calculator {&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @see Calculator#evalVillage(Village)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double evalVillage(Village village) {&lt;br /&gt;
                double tax = 0;&lt;br /&gt;
                for (int index = 0; index &amp;lt; village.size(); index++)&lt;br /&gt;
                        tax += village.getVillager(index).accept(this);&lt;br /&gt;
                return tax;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @see Calculator#evalPerson(Person)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double evalPerson(Person person) {&lt;br /&gt;
                return 1;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @see Calculator#evalRegion(Region)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double evalRegion(Region region) {&lt;br /&gt;
                double tax = 0;&lt;br /&gt;
                for (int index = 0; index &amp;lt; region.size(); index++)&lt;br /&gt;
                        tax += region.getVillage(index).accept(this);&lt;br /&gt;
                return tax;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O processo de cálculo para emergências é definido pela classe Emergency.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * The emergency help system.&lt;br /&gt;
 */&lt;br /&gt;
public class Emergency extends Calculator {&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * High-water marker for region occupation.&lt;br /&gt;
         */&lt;br /&gt;
        private final int REGION_MAX = 20;&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * High-water marker for population.&lt;br /&gt;
         */&lt;br /&gt;
        private final int VILLAGE_MAX = 100;&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @see Calculator#evalVillage(Village)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double evalVillage(Village village) {&lt;br /&gt;
                double help = 0;&lt;br /&gt;
                for (int index = 0; index &amp;lt; village.size(); index++)&lt;br /&gt;
                        help += village.getVillager(index).accept(this);&lt;br /&gt;
                if (village.size() &amp;gt; VILLAGE_MAX) help *= .75;&lt;br /&gt;
                return help;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * @see Calculator#evalPerson(Person)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double evalPerson(Person person) { return 1; }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * @see Calculator#evalRegion(Region)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double evalRegion(Region region) {&lt;br /&gt;
                double help = 0;&lt;br /&gt;
                for (int index = 0; index &amp;lt; region.size(); index++)&lt;br /&gt;
                        help += region.getVillage(index).accept(this);&lt;br /&gt;
                if (region.size() &amp;gt; REGION_MAX) help *= .9;&lt;br /&gt;
                return help;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Simple aoolication.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
public class App {&lt;br /&gt;
        /**&lt;br /&gt;
         * @param args&lt;br /&gt;
         */&lt;br /&gt;
        public static void main(String[] args) {&lt;br /&gt;
                HelpTarget v1 = new Village();&lt;br /&gt;
                HelpTarget r1 = new Region();&lt;br /&gt;
                HelpTarget p1 = new Person();&lt;br /&gt;
 &lt;br /&gt;
                Calculator sh = new Standard();&lt;br /&gt;
                Calculator eh = new Emergency();&lt;br /&gt;
 &lt;br /&gt;
                System.out.println(&amp;quot;Village help (standard): &amp;quot; + v1.accept(sh));&lt;br /&gt;
                System.out.println(&amp;quot;Region taxes (standard): &amp;quot; + r1.accept(sh));&lt;br /&gt;
                System.out.println(&amp;quot;Person taxes (standard): &amp;quot; + p1.accept(sh));&lt;br /&gt;
                System.out.println(&amp;quot;Village taxes (emergency): &amp;quot; + v1.accept(eh));&lt;br /&gt;
                System.out.println(&amp;quot;Region taxes (emergency): &amp;quot; + r1.accept(eh));&lt;br /&gt;
                System.out.println(&amp;quot;Person taxes (emergency): &amp;quot; + p1.accept(eh));&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category:PO]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
</feed>