Patrones de diseño: Test 2

Anuncio
Patrones de diseño: Test 2
1. ¿Qué patrón permite usar una clase existente cuando su interfaz no coincide son el
que necesitamos?
a) Bridge.
b) Composite.
c) Adapter.
2. El diseñador de una aventura gráfica quiere que un jugador sea capaz de coger y
soltar objetos que aparecen en la escena. Uno de los posibles objetos es una caja, que
puede contener varios objetos o, incluso, otras cajas. Se pueden añadir y sacar objetos
de la caja. ¿Cuál sería el patrón de diseño más apropiado para que se pueda coger y
soltar cualquier objeto sin necesidad de hacer distinciones en el tipo del objeto?
a) Adapter
b) Bridge
c) Composite
3. La clase BorderFactory es la responsable de crear los distintos tipos de bordes.
Podemos ver parte de su interfaz en la siguiente ilustración:
Di cuál de las siguientes afirmaciones es cierta (sólo una de ellas es cierta)
a) Esto es un ejemplo de Abstract Factory
b) Esto es un ejemplo del patrón Factory Method
c) Esto no coincide con ninguno de los patrones estudiados.
4. Un patrón que permite implementar el mecanismo de hacer y deshacer acciones así
como la creación de acciones compuestas es:
a) Composite
b) Command
c) Template Method
5. El diseñador de una aventura gráfica quiere que el usuario pueda ver, además de la
escena en la que se encuentra su personaje, un pequeño mapa que le muestre su
posición actual dentro del mundo. Podemos ver un ejemplo en la siguiente ilustración:
Cada vez que algún personaje de la escena se mueve, su nueva posición se refleja en
el mapa de la izquierda. Esto es un ejemplo de implementación del patrón…
a) Façade
b) Observer
c) Adapter
6. Dado el siguiente diseño:
Queremos que los clientes de la tienda sean informados de cada vez que se añada un
nuevo producto al catálogo de productos de la tienda. Si aplicamos el patrón Observer:
Di cuál de las siguientes afirmaciones es cierta (sólo una es cierta)
a) La clase Producto jugaría el rol Subject y la clase Tienda, el rol Observer
b) La clase Producto jugaría el rol Subject y la clase Cliente, el rol Observer
c) La clase Tienda jugaría el rol Subject y la clase Cliente, el rol Observer
7. Las clases HashTable y Vector son dos clases de Java que implementan una tabla
hash y un vector de objetos, respectivamente. Estas clases tienen un método
elements() que devuelve un objeto de la clase Enumeration. Ésta es su interfaz:
interface Enumeration {
boolean hasMoreElements();
Object nextElement();
}
Se puede usar, por ejemplo, para presentar por pantalla todos los elementos de un
Vector v:
for (Enumeration e = v.elements() ; e.hasMoreElements() ;) {
System.out.println(e.nextElement());
}
Como se puede ver, la clase Enumeration interpreta el papel de:
a) Iterator, en el patrón Iterator
b) Command, en el patrón Command
c) Observer, en el patrón Observer
8. Tenemos un framework para la creación de software relacionado con la gestión de
tiendas. Toda tienda tiene un Catalogo y éste se compone de varios ElementoCatalogo.
Un Catalogo se puede presentar por pantalla mediante el método mostrar( ).
Queremos poder hacer vistas del catálogo, es decir, filtrar el catálogo y presentar sólo
aquellos elementos del catálogo que cumplan unas determinadas propiedades. Para
ello usamos una clase FiltroCatalogo, subclase de Catalogo, cuyo método mostrar( ) es
como el siguiente:
protected void mostrar() {
Para cada ElementoCatalogo {
filtrar (elemento)
presentar por pantalla;
}
Para poder crear una vista de un catálogo se hace lo siguiente:
Catalogo c = new FiltroCatalogo( new MiCatalogo());
En el siguiente diagrama podemos ver la estructura de clases:
Este es un ejemplo del patrón:
a) Adapter
b) Decorator
c) Observer
9. Casi todos los elementos gráficos de Java heredan de la clase JComponent. Cuando
se dibuja un JComponent se puede dibujar un borde alrededor del componente,
invocando a su método paintBorder. La manera “equivocada” de implementar este
método sería la siguiente:
protected void paintBorder(Graphics g) {
switch(getBorderType()) {
case LINE_BORDER:
paintLineBorder(g);
break;
case ETCHED_BORDER: paintEtchedBorder(g);
break;
case TITLED_BORDER: paintTitledBorder(g);
break;
...
}
}
En cambio, la clase JComponent deriva en la clase Border para pintar dicho borde.
protected void paintBorder(Graphics g) {
Border border = getBorder();
if (border != null) {
border.paintBorder(this, g, 0, 0, getWidth(), getHeight());
}
}
Hay distintas implementaciones de la clase Border. Incluso, podemos crear nuestros
propios tipos de bordes. Los distintos tipos de bordes se pueden ver en la siguiente
figura:
En este diagrama, la clase LineBorder interpreta el rol:
a) ConcreteDecorator del patrón Decorator
b) Strategy del patrón Strategy
c) ConcreteStrategy del patrón Strategy
10. En un framework para la creación de editores gráficos cualquier aplicación ha de
tener una clase que herede de DrawApplication. El método main() debe ser así:
//-- main ----------------------------------------------------public static void main(String[] args) {
DrawApplication window = new MiAplicacion();
window.open();
}
La clase DrawApplication tiene el siguiente método open():
/** Opens the window and initializes its contents.*/
public void open() {
fIconkit = new Iconkit(this);
getContentPane().setLayout(new BorderLayout());
JPanel fullPanel = new JPanel();
fullPanel.setLayout(new BoxLayout(fullPanel, BoxLayout.X_AXIS));
fView = createDrawingView();
JComponent contents = createContents((StandardDrawingView)view());
contents.setAlignmentX(LEFT_ALIGNMENT);
JToolBar tools = createToolPalette();
// Creamos y añadimos la herramienta de selección
tools.setPreferredSize(new Dimension(450, 130));
JPanel activePanel = new JPanel();
activePanel.setAlignmentX(LEFT_ALIGNMENT);
activePanel.setAlignmentY(TOP_ALIGNMENT);
activePanel.setLayout(new BorderLayout());
activePanel.add(tools, BorderLayout.NORTH);
activePanel.add(contents, BorderLayout.CENTER);
fullPanel.add(activePanel);
fStatusLine = createStatusLine();
getContentPane().add(fullPanel, BorderLayout.CENTER);
getContentPane().add(fStatusLine, BorderLayout.SOUTH);
JMenuBar mb = new JMenuBar();
// Creamos y añadimos el menú File, Edit, Align y Attributes
setJMenuBar(mb);
initDrawing();
addListeners();
setVisible(true);
}
Si un programador desea añadir nuevas herramientas o nuevos menús ha redefinir el
método open, insertando código en las líneas que están en negrita. Además, no se
puede olvidar de escribir lo que está en cursiva.
Para evitar que el programador tenga que acordarse de copiar todo este código y
garantizar así la estabilidad del framework, ¿con qué patrón crearías el esqueleto del
método open, dejando la creación de menús y herramientas a las subclases?
a) FactoryMethod
b) Facade
c) Template Method
Descargar