Sie sind auf Seite 1von 5

Adapter

1) Considere um sistema composto pelas seguintes classes: class Wiliania { private HomemDireito homem; public void setHomemDireito(HomemDireito h) { homem = h; } public HomemDireito getHomemDireito() { return homem; } public void namorar() { homem.namorarSerio(); } } class HomemDireito { public void namorarSerio() { } } class Principal { public static void main(String[] args) { Wiliania w = new Wiliania(); HomemDireito coelhoDaPascoa = new HomemDireito(); w.setHomemDireito(coelhoDaPascoa); w.namorar(); } } Considere agora que a classe HomemDireito est apresentando srios problemas com o mtodo namorarSerio() e que a classe... class Plineou { public void namorarSoUmaNoite() { } } faz o mesmo trabalho namorarSoUmaNoite(); de maneira muito mais eficiente atravs do metodo

Use o padro Adapter nesse sistema ( SUA funo identificar os participantes) e faa com qe o objeto da classe Wiliania, no programa principal, possa interagir com um objeto da class Plineou (atravs do padro). RESPOSTA class AdaptadorSafado extends HomemDireito { private Plineou p; public AdaptadorSafado(Plineou p) { this.p = p; } public void namorarSerio() { p.namorarSoUmaNoite(); } } class Principal { public static void main(String[] args) { Wiliania w = new Wiliania(); HomemDireito coelhoDaPascoa = new AdaptadorSafado(new Plineou()); w.setHomemDireito(coelhoDaPascoa); w.namorar(); } }

Singleton
1) Explique claramente porque a soluo a seguir no resolve o problema de garantir uma instancia nica em ambientes com vrias linhas de execuo paralelas. class USTax { // informaes e atributos e construtor omitidos public static USTax getInstance() { if(intance == null) { synchronized(USTax.class) { instance = new USTax(); } } return instance; } } 2) Altere a classe a seguir para que ela seja um Singleton que deve ser utilizado em um ambiente SEM linhas de execuo paralelas. Use lazy instantiation. public class A { private int x; private int y; public A() { x = 0; y = 1; } public int next() { int aux = x + y; x = y; y = aux; return aux; } } RESPOSTA 1) Supondo que exista duas threads chamando o metodo getInstance() da classe USTax, e que elas entrem simultaneamente na condio if(instance == null) e algumas das duas entre no synchronized, a que entrou ma area critica ir instanciar um objeto USTax, enquanto que a outra ir esperar sua vez para executar tambm o bloco critico. Quando a 1a thread sair da area critica a segunda ir entrar e ir criar outro objeto USTax. 2) public class A { private int x; private int y; private static A instance = null; private A() { x = 0; y = 1; } public static A getInstance() { if(instance == null) { instance = new A(); } return instance; } // metodo next continua igual }

Template Method
Explique claramente o que o padro template method. Explique o que so hooks (ganchos), quando devemos utiliz-los e qual a relao desse padro com o factory method. RESPOSTA O padro template method define um metodo final onde ser feita uma chamada aos metodos abstratos e os hooks que foram definidos na classe, que podero ser sobrescrito pelas suas subclasses. Hooks so metodos definidos pela classe abstrata e que possuem uma implementao padro. A utilizao do hook feita quando uma determinada implementao bem comum, dando a opo ao programador de sobrescrever o metodo ou no. A relao do template method com o factory method est em passar para as subclasses o poder de modificar como uma implentao ir funcionar.

Composite
1) Explique o que o padro Composite e quais so seus participantes. Cite alguma biblioteca ou framework Java que faa uso desse padro e ao menos uma classe que seja participante do padro (no esquea de dizer que tipo de participante essa class). 2) Uma empresa que manter sua estrutura hierrquica e clacular seu custo. Seu lider de equipe solicitou a utilizao do padro Composite pra representar a empresa, que composta por vrias divises (por exemplo, departamento de recursos humanos, departamento de informatica, etc). Cada diviso pode conter tanto recursos como outras divises. Os recursos, inicialmente, so apenas recuros humanos e mquinas (cada um tem um nome e um custo associado, assim como as divises). a) Implemte um mtodo que exportarXML() (nas folhas e no composite) permita escrever na sada padro toda a estrutuca hierrquica da empresa na forma de um texto XML. Cada componente uma marca <divisao> ou <recursos>. Ambas as marcas possuem uma propriedade chamado tipo, cujo valor ser o nome da classe concreta representante de uma folhas do padro (isso importante numa futura recuperao da hierarquia de objetos a partir de texto XML). Uma possivel sada do mtodo print() seria: <divisao tipo=Divisao nome=Empresa X> <recurso tipo=RecursoHumano nome=Maria Pre custo=345 /> <recurso tipo=Maquina nome=computador x custo=3545 /> <divisao tipo=Divisao nome=dep1.1> <recurso tipo=Maquina nome=impressora x /> </divisao> </divisao> b) Implemente (nas folhas e no composite) o metodo custo() RESPOSTA 1) O padro composite define uma forma do cliente acessar objetos de maneira uniforme, sendo composto por uma classe abstrata componente que far a interface com o cliente, que ir conter todos os metodos, tanto das folhas quanto do composite. O composite ter uma lista de Compoent e dar acesso a inserso, remoo, recuperao dos filhos (objetos da lista) e uma operao, que deve ser repassada para todos os seus filhos. Uma classe Leaf no deve possuir metodos de acesso aos filhos, pois ela no possui filhos, a classe s deve possuir metodos pertinente a ela e uma operao, como o print usado no livro use a cabea. Uma biblioteca que usa o composite no Java a swing, uma classe participante do padro composite o Jframe, que um composite, pois dentro dela pode haver vrios outros Jframe, Jlabel,

JtextArea, etc. 2a e b) abstract class Empresa { String getNome() throws UnsupportedOperationException { throw new UnsupportedOperationException(No implementado); } Empresa getFilho(int i) throws UnsupportedOperationException { throw new UnsupportedOperationException(No implementado); } void adicionar(Empresa e) throws UnsupportedOperationException { throw new UnsupportedOperationException(No implementado); } void remover(Empresa e) throws UnsupportedOperationException { throw new UnsupportedOperationException(No implementado); } abstract void exportarXML(); abstract double custo(); } class Recurso extends Empresa { String nome, tipo; double custo; Recurso(String n, String t, double c) { tipo = t; nome = n; custo c; } String getNome() { return nome; } double custo() { return custo; } void exportarXML() { System.out.println(<recurso tipo=\ + tipo + \ nome=\ + nome + \ custo=\ + custo + \ />); } } class Divisao extends Empresa { String nome, tipo; List<Empresa> l = new ArrayList(); Divisao(String n, String t) { nome = n; tipo = t; } String getNome() { return nome; } double custo() { double c = 0.0; for(Empresa e : l) { c += e.custo(); } return c; } Empresa getFilho(int i) { return l.get(i); } void adicionar(Empresa e) { l.add(e); }

void remover(Empresa e) { l.remove(e); } void exportarXML() { System.out.println(<divisao tipo=\ + tipo + \ nome=\ + nome + \ >); for(Empresa e : l) { e.exportarXML(); } System.out.println(</divisao>); } }

Observer
// Eu no tenho a pergunta mais acho que deve ser algo assim... Explique como deve ser aplicado o observer. RESPOSTA Para se aplicar o observer necessrio criar uma classe de evento, esse evento segua a nomeclatura <nome_do_source>Event. Criar tambm uma interface para os listenes, possuindo metodos que retornem void e receba um event, o nome do metodo deve estar no passado, a sua nomeclatura <nome_do_source>Listener. Se o projetista desejar, pode-se criar uma classe que implemente os metodos da interface listener, que no faa nada (Adapter). Sua nomeclatura <nome_do_source>Adapter. Uma classe Source com os metodos Add<nome_do_listener> e remove<nome_do_listener>. O source tambm possui um lista de listener que ir notificar os listeners de que um evento ocorreu. Implementar a interface listener ou o adapter, adiciona-los ao source para que eles sejam notificados.

Das könnte Ihnen auch gefallen