Considere a classe Player
apresentada a seguir, responsável pela representação de um jogador em um jogo de computador.
public class Player
{
private String name;
private Integer phase;
private Double energy;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getPhase() { return phase; }
public void setPhase(Integer phase) { this.phase = phase; }
public Double getEnergy() { return energy; }
public void setEnergy(Double energy) { this.energy = energy; }
}
Conforme observado, a classe não armazenada nenhum informação para que o jogo possa ser recuperado posteriormente, caso o jogador venha a perder ou desistir da partida, pois a classe armazena apenas os valores correntes do jogador. Qual padrão de projeto deveria ser utilizado na classe Player
para que o usuário possa salvar e retornar ao jogo posteriormente.
Altere a classe Player
para que a mesma possa salvar e retornar ao jogo posteriormente. Siga as recomendações estabelecidas pelo padrão de projeto selecionado na questão 01.
public class Player
{
private String name;
private Integer phase;
private Double energy;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getPhase() { return phase; }
public void setPhase(Integer phase) { this.phase = phase; }
public Double getEnergy() { return energy; }
public void setEnergy(Double energy) { this.energy = energy; }
public Object createMemento()
{
Memento memento = new Memento();
memento.name = name;
memento.phase = phase;
memento.energy = energy;
return memento;
}
public void setMemento(Object object)
{
if(object instanceof Memento)
{
Memento memento = (Memento) object;
name = memento.name;
phase = memento.phase;
energy = memento.energy;
}
}
private class Memento {
private String name;
private Integer phase;
private Double energy;
}
}
Na criação de fluxos de leitura e escrita na linguagem de programação Java, é possível combinar diversas funcionalidades em um único fluxo de dados, sem a necessidade de subclasses para todas as combinações possíveis, como pode ser observado no diagrama UML (Unified Modeling Language) apresentado a seguir, que apresenta parte da hierarquia de classes do fluxo de leitura.
Qual padrão de projeto foi adotado pela linguagem de programação Java para promover essa característica.
O padrão de projeto Singleton é um padrão de projeto de criação, cujo objetivo é garantir que a classe ofereça apenas uma única instância do objeto, que será controlada por ela mesma. Considere as seguintes implementações em Java do padrão de projeto Singleton.
public class Singleton {
private final static Singleton singleton = new Singleton();
private Singleton() { }
public static Singleton getInstance() { return singleton; }
}
public class Singleton {
private static Singleton singleton;
private Singleton() { }
public static Singleton getInstance() {
if(singleton == null) { singleton = new Singleton(); }
return singleton;
}
}
public class Singleton {
private static Singleton singleton;
private Singleton() { }
public static synchronized Singleton getInstance() {
if(singleton == null) { singleton = new Singleton(); }
return singleton;
}
}
public class Singleton {
private static Singleton singleton;
private Singleton() { }
public static Singleton getInstance() {
if(singleton == null) {
synchronized(Singleton.class) { singleton = new Singleton(); }
}
return singleton;
}
}
public class Singleton {
private static Singleton singleton;
private Singleton() { }
public static Singleton getInstance() {
if(singleton == null) {
synchronized(Singleton.class) {
if(singleton == null) { singleton = new Singleton(); }
}
}
return singleton;
}
}
Todas as implementações apresentadas funcionam perfeitamente na existência de um único processo em execução, mas no caso da aplicação possuir vários processos (threads), apenas duas implementações garantem a existência de uma única instancia da classe, ou seja, são thread-safe. Quais são as duas implementações, que no caso da existência de threads, garantem a existência de uma única instancia da classe Singleton
?
Na linguagem de programação Java, objetos do tipo String
são considerados objetos imutáveis, ou seja, caso alguma alteração seja realizada em seus valores, novos objetos são criados. Em contrapartida, caso você tenha criado dois objetos com o mesmo valor, a linguagem armazena uma única instância na memória, evitando que você tenha objetos duplicados. Qual padrão de projeto foi adotado pela linguagem de programação Java para promover essa característica.
No desenvolvimento de sistemas computacionais, algumas vezes nos deparamos com problemas onde parte de um determinado algoritmo depende da implementação de classes filhas, mas a estrutura do algoritmo é única. Por exemplo, podemos ter uma classe que monta relatórios denominada Report
. O algoritmo para montar relatórios é sempre o mesmo, consistindo nas seguintes operações:
Apesar da sequência de operações ser a mesma, os detalhes da implementação podem variar. Relatórios para a mesma empresa podem manter o cabeçalho e o rodapé e variar o conteúdo do corpo. Em outros cenários pode ser necessário variar também o cabeçalho e o rodapé. Qual padrão de projeto deveria ser utilizado para modelar as classes para atender aos diversos cenários?
Imagine o cenário onde você tem uma definição por interface Java do padrão de classes da entidade Temperature
. Duas implementações foram criadas com tal interface e existe uma classe de gerenciamento UITemperature
, que tem a responsabilidade de transmitir os dados das temperaturas para os elementos de uma interface gráfica, conforme apresentado no diagrama UML (Unified Modeling Language) a seguir.
Neste modelo temos três classes principais: Temperature
(modelo do domínio de negócio), UITemperature
(controle) e Panel
(visualização). A classe UITemperature
teria a seguinte codificação:
public class UITemperature {
public void showTemperature(Panel panel, Temperature temperature) {
panel.setTemperature(temperature.getDegree());
}
}
Agora imagine que surgiu um novo sistema Java que deverá ser integrado ao sistema atual sem alterar o original. Neste sistema existe a seguinte implementação de TemperatureK
.
Percebemos que apesar da temperatura apresentar as mesmas características e comportamentos, todos os nomes de métodos estão diferentes. Podemos imaginar que nesta situação a solução seria alterar a classe UITemperature
, adicionando um novo método showTemperatureK
.
public class UITemperature {
public void showTemperature(Panel panel, Temperature temperature) {
panel.setTemperature(temperature.getDegree());
}
public void showTemperatureK(Panel panel, TemperatureK temperature) {
panel.setTemperature(temperature.getMeasure());
}
}
A consequência é que a camada de controle tende a crescer a medida que novas inclusões são feitas no sistema causando uma dispersão das lógicas associadas as classes de representação da entidade Temperature
. Todo o sistema terá que tratar de uma forma a temperatura padrão e de outra forma a temperatura em Kelvin e eventuais novas que surgirem. Este crescimento é bastante desordenado, uma vez que classes como Temperature
, se comunicam com diversas partes do modelo. Qual padrão de projeto deveria ser utilizado para solucionar este problema com a inserção de novas temperaturas?
Apresente o diagrama UML (Unified Modeling Language) da solução, adotando o padrão de projeto selecionado na questão 07.