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