Análise e Projeto Orientados  
por Objetos  
Aula 11 Padrões GoF (Bridge e Decorator)  
Edirlei Soares de Lima  
<edirlei@iprj.uerj.br>  
Padrões GoF  
Criação:  
Estruturais:  
Comportamentais:  
Abstract Factory  
Builder  
Factory Method  
Prototype  
Singleton  
Adapter  
Bridge  
Chain of Responsibility  
Command  
Interpreter  
Iterator  
Mediator  
Memento  
Composite  
Decorator  
Façade  
Flyweight  
Proxy  
Observer  
State  
Strategy  
Template Method  
Visitor  
Bridge  
Intenção: desacoplar uma abstração de sua implementação  
de tal forma que a implementação possa ser facilmente  
trocada.  
Solução: encapsular os detalhes de implementação em um  
objeto que é um componente da abstração.  
Bridge  
Bridge Exemplo  
Bridge Implementação  
public interface DrawAPI {  
public void drawCircle(int radius, int x, int y);  
}
public class RedCircle implements DrawAPI {  
Override  
@
public void drawCircle(int radius, int x, int y) {  
System.out.println("Drawing Circle[ color: red, radius: " +  
radius + ", x: " + x + ", " + y + "]");  
}
}
public class GreenCircle implements DrawAPI {  
Override  
@
public void drawCircle(int radius, int x, int y) {  
System.out.println("Drawing Circle[ color: green, radius: "  
+
radius + ", x: " + x + ", " + y + "]");  
}
}
Bridge Implementação  
public abstract class Shape {  
protected DrawAPI drawAPI;  
protected Shape(DrawAPI drawAPI){  
this.drawAPI = drawAPI;  
}
public abstract void draw();  
}
public class Circle extends Shape {  
private int x, y, radius;  
public Circle(int x, int y, int radius, DrawAPI drawAPI) {  
super(drawAPI);  
this.x = x;  
this.y = y;  
this.radius = radius;  
}
public void draw() {  
drawAPI.drawCircle(radius,x,y);  
}
}
Bridge Implementação  
public static void main(String[] args)  
{
Shape redCircle = new Circle(100,100, 10, new RedCircle());  
Shape greenCircle = new Circle(100,100, 10, new GreenCircle());  
redCircle.draw();  
greenCircle.draw();  
}
Bridge Aplicabilidade  
O padrão Bridge é útil quando se tem uma abstração que tem  
diferentes implementações.  
Este padrão permite que a abstração e a sua implementação  
variem independentemente.  
Decorator  
Intenção: permitir que seja possível adicionar uma nova  
funcionalidade a um objeto existente sem alterar sua  
estrutura.  
Funcionalidades devem ser adicionadas em instancias individuais e  
não na classe.  
Solução: criar uma classe que envolva a classe original,  
mantendo intacta a assinatura dos métodos e fornecendo  
funcionalidades adicionais.  
Decorator  
Decorator Exemplo  
Decorator Implementação  
public interface Shape  
{
void draw();  
}
public class Rectangle implements Shape  
{
@Override  
public void draw()  
{
System.out.println("Shape: Rectangle");  
}
}
Decorator Implementação  
public class Circle implements Shape  
{
@Override  
public void draw()  
{
System.out.println("Shape: Circle");  
}
}
public abstract class ShapeDecorator implements Shape {  
protected Shape decoratedShape;  
public ShapeDecorator(Shape decoratedShape){  
this.decoratedShape = decoratedShape;  
}
public void draw(){  
decoratedShape.draw();  
}
}
Decorator Implementação  
public class RedShapeDecorator extends ShapeDecorator  
{
public RedShapeDecorator(Shape decoratedShape)  
{
super(decoratedShape);  
}
@Override  
public void draw()  
{
decoratedShape.draw();  
setRedBorder(decoratedShape);  
}
private void setRedBorder(Shape decoratedShape)  
{
System.out.println("Border Color: Red");  
}
}
Decorator Implementação  
public static void main(String[] args)  
{
Shape circle = new Circle();  
Shape redCircle = new RedShapeDecorator(new Circle());  
Shape redRectangle = new RedShapeDecorator(new Rectangle());  
System.out.println("Circle with normal border");  
circle.draw();  
System.out.println("\nCircle of red border");  
redCircle.draw();  
System.out.println("\nRectangle of red border");  
redRectangle.draw();  
}
Decorator Aplicabilidade  
Aplicável quando é necessário acrescentar ou remover  
responsabilidades a objetos individuais dinamicamente, de  
forma transparente.  
Ajuda a evitar a explosão de subclasses para prover todas as  
combinações de responsabilidades.