Sunteți pe pagina 1din 30

FACULDADES SPEI CURSO DE TECNOLOGIA EM ANLISE E DESENVOLVIMENTO DE SISTEMAS

PADRES DE PROJETO DE SOFTWARE DISIGNER PATNER

CURITIBA

ii

2012

ii

FERNANDO JOSE DA SILVA PAIVA

PADRES DE PROJETO DE SOFTWARE DISIGNER PATNER Plano de Projeto Apresentado para Recuperao de Avaliao AE1 ao Curso de Tecnologia em Analise e Desenvolvimento de Sistemas, Disciplina Arquitetura de Software, Faculdades SPEI. Professor: Frank Coelho de Alcntara

CURITIBA 2012

SUMRIO

SUMRIO.....................................................................................................................II LISTA DE FIGURAS...................................................................................................III LISTA DE TABELAS..................................................................................................IV 1. INTRODUO..........................................................................................................1 1.1.1. HISTRICO.........................................................................................................1 1.1.2. PADRES GOF..................................................................................................2 1.1.3. PADRES DE CRIAO..................................................................................2 1.1.4. PADRES EXTRUTURAIS .............................................................................11 2. DOCUMENTOS CONSULTADOS..........................................................................24

ii

LISTA DE FIGURAS FIGURA 1 LOGO SPEI.............................................................................................23

iii

LISTA DE TABELAS TABELA 1 TTULO DA TABELA.............................................................................23

iv

1. INTRODUO Um Padro de Projeto de Software ou Padro de Desenho de Software, tambm muito conhecido pelo termo original em ingls, Design Pattern, descreve uma soluo geral reutilizvel para um problema recorrente no desenvolvimento de sistemas de software orientados a objetos. No um cdigo final, uma descrio ou modelo de como resolver o problema do qual trata, que pode ser usada em muitas situaes diferentes. Os Padres de Projeto normalmente definem as relaes e interaes entre as classes ou objetos, sem especificar os detalhes das classes ou objetos envolvidos, ou seja, esto num nvel de generalidade mais alto.

1.1.1. HISTRICO Em 1987, a partir dos conceitos criados por Alexander, os programadores Kent Beck e Ward Cunningham propuseram os primeiros padres de projeto para a rea da cincia da computao. Em um trabalho para a conferncia OOPSLA, eles apresentaram alguns padres para a construo de janelas na linguagem Smalltalk. [4] Nos anos seguintes Beck, Cunningham e outros seguiram com o desenvolvimento destas idias. O movimento ao redor de padres de projeto ganhou popularidade com o livro Design Patterns: Elements of Reusable Object-Oriented Software, publicado em 1995. Os autores desse livro, Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides, so conhecidos como a "Gangue dos Quatro" (Gang of Four) ou simplesmente "GoF". Um padro de projeto define :

seu nome, o problema, a soluo, quando aplicar esta soluo e suas consequncias.

Os padres de projeto :

visam facilitar a reutilizao de solues de desenho - isto , solues na fase de projeto do software - e

estabelecem um vocabulrio comum de desenho, facilitando comunicao, documentao e aprendizado dos sistemas de software.

1.1.2. PADRES GOF Os padres "GoF" so organizados em 3 famlias :


Padres de criao : relacionados criao de objetos Padres estruturais : tratam das associaes entre classes e objetos. Padres comportamentais : tratam das interaes e divises de responsabilidades entre as classes ou objetos.

1.1.3. PADRES DE CRIAO


Abstract Factory Builder Factory Method Prototype Singleton

ABSTRACT FACTORY (FABRICAO ABSTRATA) Utilizao Este padro permite a criao de famlias de objetos relacionados ou dependentes, atravs de uma nica interface e sem que a classe concreta seja especificada. O padro Abstract Factory pode ser utilizado na implementao de um toolkit que disponibilize controles que funcionem em diferentes interfaces grficas. Exemplo Neste exemplo, a classe abstrata WidgetFactory possui duas especializaes: MotifWidgetFactory para widgets Motif e QtWidgetFactory para widgets Qt. Essas especializaes so classes concretas capazes de "produzir" os elementos da interface grfica. O cliente do toolkit obtm os elementos grficos de que necessita atravs da classe (interface) WidgetFactory sem ter conhecimento das classes concretas. Da mesma maneira, o cliente somente interage com as interfaces que representam os elementos produzidos pela Abstract Factory (no exemplo, a classe Janela e a classe Botao).

Cdigo em Java (Abstract Factory)


abstract class WidgetFactory { public static WidgetFactory obterFactory() { if( Configuracao.obterInterfaceGraficaAtual() == Configuracao.MotifWidget ) { return new MotifWidgetFactory(); } else { return new QtWidgetFactory(); } } public abstract Botao criarBotao(); } class MotifWidgetFactory extends WidgetFactory { public Botao criarBotao() { return new BotaoMotif(); } } class QtWidgetFactory extends WidgetFactory { public Botao criarBotao() { return new BotaoQt(); } } abstract class Botao { public abstract void desenhar(); } class BotaoMotif extends Botao { public void desenhar() { System.out.println("Eu sou um botao Motif!"); } } class BotaoQt extends Botao { public void desenhar() { System.out.println("Eu sou um botao Qt!"); } } public class Cliente { public static void main(String[] args) { WidgetFactory factory = WidgetFactory.obterFactory(); Botao botao = factory.criarBotao(); botao.desenhar(); } }

BUILDER (CONSTRUTOR) E um padro de projeto de software que permite a separao da construo de um objeto complexo da sua representao, de forma que o mesmo processo de construo possa criar diferentes representaes.

Utilizao O padro Builder pode ser utilizado em uma aplicao que converte o formato RTF para uma srie de outros formatos e que permite a incluso de suporte para converso para outros formatos, sem a alterao do cdigo fonte do leitor de RTF. A implementao da soluo para esse problema pode ser realizada atravs de uma classe de leitura (director) associada a uma classe capaz de converter o formato RTF para outra representao (builder). O objeto da classe de leitura l cada token do texto e executa o mtodo apropriado no objeto de converso, de acordo com tipo do token. A classe de converso possui um mtodo para cada tipo de token, incluindo os caracteres comuns, pargrafos, fontes e etc. Para cada formato de texto suportado criada uma classe de converso especializada (concrete builder). Um conversor para formato ASCII, por exemplo, poderia ignorar qualquer requisio para converter tokens que no fossem caracteres comuns. Um conversor para o formato PDF, por outro lado, iria processar qualquer requisio para poder converter o estilo, alm do texto. Exemplo Neste exemplo, o mtodo lerRTF() (classe LeitorRTF) percorre uma lista com os tokens encontrados no texto de entrada (formato RTF) e, para cada tipo de token, chama um mtodo do objeto de tipo ConversorTexto. Dependendo do formato escolhido para o texto de destino, ser escolhida uma implementao da classe
ConversorTexto: ConversorPDF, ConversorTeX

ou ConversorASCII. Cada uma destas no implementa os mtodos

classes implementa os mtodos de acordo com as caractersticas do formato relacionado. A classe


ConversorASCII

converteParagrafo()

e converteFonte() pois este formato (ASCII) no possui

elementos de estilo.

Cdigo em Java (Builder)

abstract class ConversorTexto { public void converterCaractere(char c) { // vazio } public void converterParagrafo() { // vazio } public void converterFonte(Fonte f) { // vazio } } class ConversorPDF extends ConversorTexto { public void converterCaractere(char c) { System.out.print("Caractere PDF"); } public void converterParagrafo() { System.out.print("Pargrafo PDF"); } public void converterFonte(Fonte f) { System.out.print("Fonte PDF"); } } class ConversorTeX extends ConversorTexto { public void converterCaractere(char c) { System.out.print("Caractere Tex"); } public void converterParagrafo() { System.out.print("Paragrafo Tex"); } public void converterFonte(Fonte f) { System.out.print("Fonte Tex"); } } class ConversorASCII extends ConversorTexto { public void converterCaractere(char c) { System.out.print("Caractere ASCII"); } } class LeitorRTF { private ConversorTexto conversor; LeitorRTF(ConversorTexto c) { this.conversor = c; } public void lerRTF() { List<Token> tokens = obterTokensDoTexto(); for (Token t : tokens) { if (t.getTipo() == Token.Tipo.CARACTERE) { conversor.converterCaractere(t.getCaractere()); } if (t.getTipo() == Token.Tipo.PARAGRAFO) { conversor.converterParagrafo(); } if (t.getTipo() == Token.Tipo.FONTE) { conversor.converterFonte(t.getFonte()); } } } } public class Cliente {

public static void main(String[] args) { ConversorTexto conversor; if (args[0].equals("pdf")) { conversor = new ConversorPDF(); } else if (args[0].equals("tex")) { conversor = new ConversorTeX(); } else { conversor = new ConversorASCII(); } LeitorRTF leitor = new LeitorRTF(conversor); leitor.lerRTF(); } }

FACTORY METHOD (CRIAO DE MTODO ) um padro de projeto de software que define uma classe para criao de um objeto, mas permite que as subclasses escolham qual classes instanciar. O factory method permite delegar a instanciao para as subclasses Utilizao Este padro muito utilizado em frameworks para definir e manter relacionamentos entre objetos. O framework Spring, dependendo da configurao, pode utilizar um Factory Method para criar os seus beans. Este padro pode ser utilizado na construo de um framework que suporta aplicaes que apresentam mltiplos documentos ao usurio. Normalmente este tipo de aplicao manipula um nmero varivel de formatos de documento e, por isso, este framework deve ser flexvel o bastante para suportar qualquer formato. Uma soluo para este problema poderia disponibilizar, no framework, o cdigo para alguns dos formatos mais utilizados. Mas, na prtica, esta soluo seria uma implementao pouco flexvel, e at mesmo incompleta, j que custoso implementar os mais variados formatos. O padro Factory Method prope uma soluo que deixa para o cliente (a implementao da aplicao) a tarefa de suportar os formatos necessrios e para o framework o papel de definio de uma abstrao que oferece uma interface nica para criao de documentos. Cdigo em Java ( Factory Methodo)
/** * Abstrao de uma Aplicao capaz de manipular * documentos. */ abstract class Aplicacao { private Documento doc; /** * Abstrao do Factory Method */ abstract Documento criaDocumento();

void novoDocumento() { this.doc = this.criaDocumento(); } void abrirDocumento() { this.doc.abrir(); }

/** * Abstrao de um Documento. */ abstract class Documento { void abrir() { System.out.println("Documento:Abrir documento!"); } void fechar() { System.out.println("Documento:Fechar documento!"); } void gravar() { System.out.println("Documento:Gravar documento!"); }

/** * Esta classe concreta contm a implementao * de uma aplicao capaz de manipular documentos * do tipo MeuDocumento. */ class MinhaAplicacao extends Aplicacao { /** * Uma implementao do Factory Method. Este mtodo * especializado na criao de documentos do tipo MeuDocumento */ Documento criaDocumento() { return new MeuDocumento(); }

/** * Esta classe concreta contm a implementao * de um tipo de documento especfico. */ class MeuDocumento extends Documento { }

PROTOTYPE (PROTTIPO)

Padrao de projeto de Software que permite a criao de objetos a partir de um modelo original, ou prottipo. O padro Prototype exige a implementao de uma operao de clonagem em cada uma das classes concretas do prottipo. Esta tarefa pode ser inconveniente, no caso do reaproveitamento de classes pr-existentes que no possuem tal operao, ou mesmo complexa, se for considerada a possibilidade de existirem referncias circulares nos atributos de um objeto (um objeto possui um atributo que referncia um objeto que, por sua vez, referncia o objeto original Utilizao O padro Prototype pode ser utilizado em sistemas que precisam ser independentes da forma como os seus componentes so criados, compostos e representados. O padro Prototype pode ser til em sistemas com as seguintes caractersticas:

sistemas que utilizam classes definidas em tempo de execuo; sistemas que utilizam o padro Abstract Factory para criao de objetos. Neste caso, a hierarquia de classes pode se tornar muito complexa e o padro Prototype pode ser uma alternativa mais simples, por realizar a mesma tarefa com um nmero reduzido de classes; sistemas que possuem componentes cujo estado inicial possui poucas variaes e onde conveniente disponibilizar um conjunto pr-estabelecido de prottipos que do origem aos objetos que compem o sistema.

Quando utiliza o framework Spring, por exemplo, um desenvolvedor pode configurar um JavaBean como "prototype". Esta configurao faz com que cada uma das referncias a um JavaBean aponte para uma instncia diferente. O comportamento padro, ou singleton, define que todas as referncias a um JavaBean apontem para a mesma instncia de uma classe.[1] Exemplo Neste exemplo mostrado uma hierarquia de classes representando documentos de formato ASCII e PDF que so criados atravs da classe Cliente. A partir de duas instncias prototpicas, ascii e pdf, o mtodo criarDocumento cria clones de documentos de acordo com o tipo desejado. A tarefa de realizar a criao da instncia implementada na classe Documento e herdada por suas classes filhas,
ASCII

e PDF.

Codigo em Java ( Prototype)


abstract class Documento implements Cloneable { protected Documento clone() { Object clone = null; try { clone = super.clone(); } catch (CloneNotSupportedException ex) { ex.printStackTrace(); } return (Documento) clone; } } class ASCII extends Documento { } class PDF extends Documento { } class Cliente { static final int DOCUMENTO_TIPO_ASCII = 0; static final int DOCUMENTO_TIPO_PDF = 1; private Documento ascii = new ASCII(); private Documento pdf = new PDF(); public Documento criarDocumento(int tipo) { if (tipo==Cliente.DOCUMENTO_TIPO_ASCII) { return ascii.clone(); } else { return pdf.clone(); }

10

} }

SINGLETON (FILHO NICO) Este padro garante a existncia de apenas uma instncia de uma classe, mantendo um ponto global de acesso ao seu objeto. Nota lingustica: O termo vem do significado em ingls quando se resta apenas uma carta nas mos, num jogo de baralho. Muitos projetos necessitam que algumas classes tenham apenas uma instncia. Por exemplo, em uma aplicao que precisa de uma infraestrutura de log de dados, pode-se implementar uma classe no padro singleton. Desta forma existe apenas um objeto responsvel pelo log em toda a aplicao que acessvel unicamente atravs da classe singleton Utilizao Quando voc necessita de somente uma instncia da classe, por exemplo, a conexo com banco de dados, vamos supor que voc ter que chamar diversas vezes a conexo com o banco de dados em um cdigo na mesma execuo, se voc instanciar toda vez a classe de banco, haver grande perda de desempenho, assim usando o padro singleton, garantida que nesta execuo ser instnciada a classe somente uma vez. Lembrando que este pattern considerado por muitos desenvolvedores um anti-pattern, ento, cuidado onde for utiliz-lo. Cdigo em Java ( Singleton)
public final class MySingleton { // Instancia esttica privada que ser acessada private static final MySingleton INSTANCE = new MySingleton(); // Construtor privado. Suprime o construtor pblico padrao. private MySingleton() { // Operaes de inicializao da classe } // Mtodo pblico esttico de acesso nico ao objeto! public static synchronized MySingleton getInstance(){ return INSTANCE;

11

} }

1.1.4. PADRES EXTRUTURAIS ADAPTER (ADAPTADOR) O Padro de Projeto Adapter, tambm conhecido como Wrapper um padro de estrutura. Esse padro de projeto tem como finalidade adaptar a interface de uma classe, permitindo que classes com interfaces incompatveis possam interagir.

Cdigo em Java (ADAPTER)

/** Classe que representa uma pea quadrada **/ package br.com.flaviojmendes class PecaQuadrada { private double largura; public PecaQuadrada( double l ) public double getLargura() { largura = l; } { return largura; }

public void setLargura( double l ) { largura = l; } }

/** Classe que representa uma vasilha redonda **/ package br.com.flaviojmendes class VasilhaRedonda { private int raio; public VasilhaRedonda( int r ) { raio = r;

12

System.out.println( "Vasilha Redonda: a maior pea quadrada que cabe deve possuir " + r * Math.sqrt(2) ); } public int getRaio() { return raio; } }

/** Implementando classe para Adaptar a pea vasilha **/ package br.com.flaviojmendes class PecaQuadradaAdapter { // A classe adapter/wrapper possui uma instncia da classe a ser adaptada private PecaQuadrada pecaQuadrada; public PecaQuadradaAdapter( double l ) { pecaQuadrada = new

PecaQuadrada( l ); } // Identificar a interface alvo public void fazerCaber( VasilhaRedonda vr ) { // O adapter/wrapper fica encarregado de "fazer caber" double cmDiminuir = pecaQuadrada.getLargura() - vr.getRaio() * Math.sqrt(2); System.out.println( "reduzindo PecaQuadrada " + pecaQuadrada.getLargura() + " em " + ((cmDiminuir < 0) ? 0 : cmDiminuir) + " cm" ); if (cmDiminuir > 0) { pecaQuadrada.setLargura( pecaQuadrada.getLargura() - cmDiminuir ); System.out.println( " largura agora " + pecaQuadrada.getLargura() ); } } } /** Classe de teste para aplicar o padro **/ package br.com.flaviojmendes

13

class TesteAdapter { public static void main( String[] args ) { VasilhaRedonda vr = new VasilhaRedonda( 5 ); PecaQuadradaAdapter adapter; for (int i=6; i < 10; i++) { adapter = new PecaQuadradaAdapter( (double) i ); // Adaptando para a nova interface adapter.fazerCaber( vr ); } } }

Bridge ( Ponte) Utilizado quando desejvel que uma interface (abstrao) possa variar independentemente das suas implementaes. Imagine um sistema grfico de janelas que deve ser portvel para diversas plataformas. Neste sistema so encontrados diversos tipos de janelas, como cones, dilogos, etc. Estas janelas formam uma hierarquia que contm uma abstrao das janelas (classe base). Normalmente, a portabilidade seria obtida criando-se especializaes dos tipos de janelas para cada uma das plataformas suportadas. O problema com essa soluo reside na complexidade da hierarquia gerada e na dependncia de plataforma que existir nos clientes do sistema. Atravs do padro Bridge, a hierarquia que define os tipos de janelas separada da hierarquia que contm a implementao. Desta forma todas as operaes de Janela so abstratas e suas implementaes so escondidas dos clientes. Exemplo O diagrama mostra a soluo para o problema citado. Temos duas hierarquias de classes relacionadas: a hierarquia de tipos de janelas (Janela, Icone e Dialogo) e a de implementao nas plataformas suportadas (JanelaImpl, XWindowImpl e MSWindowImpl). O relacionamento entre as interfaces, Janela e JanelaImpl, a

14

"ponte" que "desacopla" a interface da implementao. Para que um cone seja desenhado, faz-se uma chamada ao mtodo DesenhaBorda() que por sua vez realiza "n" chamadas ao mtodo DesenhaLinha() da classe XWindowImpl ou MSWindowImpl, dependendo da plataforma desejada.

Cdigo em Java
/** "Implementor" */ interface DrawingAPI { public void drawCircle(double x, double y, double radius); } /** "ConcreteImplementor" 1/2 */ class DrawingAPI1 implements DrawingAPI { public void drawCircle(double x, double y, double radius) { System.out.printf("API1.circle at %f:%f radius %f\n", x, y, radius); } } /** "ConcreteImplementor" 2/2 */ class DrawingAPI2 implements DrawingAPI { public void drawCircle(double x, double y, double radius) { System.out.printf("API2.circle at %f:%f radius %f\n", x, y, radius); } } /** "Abstraction" */ abstract class Shape { protected DrawingAPI drawingAPI; protected Shape(DrawingAPI drawingAPI){

15

this.drawingAPI = drawingAPI; } public abstract void draw(); public abstract void resizeByPercentage(double pct); } /** "Refined Abstraction" */ class CircleShape extends Shape { private double x, y, radius; public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) { super(drawingAPI); this.x = x; this.y = y; this.radius = radius; } // low-level i.e. Implementation specific public void draw() { drawingAPI.drawCircle(x, y, radius); } // high-level i.e. Abstraction specific public void resizeByPercentage(double pct) { radius *= pct; } } /** "Client" */ class BridgePattern { public static void main(String[] args) { Shape[] shapes = new Shape[] { new CircleShape(1, 2, 3, new DrawingAPI1()), new CircleShape(5, 7, 11, new DrawingAPI2()), }; for (Shape shape : shapes) { shape.resizeByPercentage(2.5); shape.draw(); } } } // low-level // high-level

16

COMPOSITE (COMPOSTO) Composite um padro de projeto de software utilizado para representar um objeto que constitudo pela composio de objetos similares a ele. Neste padro, o objeto composto possui um conjunto de outros objetos que esto na mesma hierarquia de classes a que ele pertence. O padro composite normalmente utilizado para representar listas recorrentes - ou recursivas - de elementos. Alm disso, esta forma de representar elementos compostos em uma hierarquia de classes permite que os elementos contidos em um objeto composto sejam tratados como se fossem um nico objeto. Desta forma, todos os mtodos comuns s classes que representam objetos atmicos da hierarquia podero ser aplicveis tambm ao conjunto de objetos agrupados no objeto composto. Utilizao Utilizado sempre que necessrio representar elementos que so compostos por outros elementos similares. Por exemplo, em interfaces grficas um elemento grfico pode ser constitudo pela composio de vrios outros elementos grficos. Uma janela pode conter um ou mais cones, uma caixa de texto e vrios outros elementos grficos - at mesmo outra janela. Considerando que uma determinada hierarquia de classes indicasse ElementoGrfico como a super-classe comum a todas classes que representassem os elementos grficos atmicos, a classe Janela seria representada como uma classe que contm zero (0) ou mais elementos grficos

Exemplo Outro exemplo clssico o de gramticas utilizadas para definir linguagens de programao. Se utilizarmos uma hierarquia de classes para representar os comandos da linguagem, supondo que a super-classe seria Comando, teramos uma classe para o comando de atribuio, outro para, digamos, o comando While, outra para o comando composto - comando que constitudo por uma lista de outros comandos normalmente delimitados por indicadores como { e } ou palavras reservadas como begin e end - e assim por diante. Pois bem, comandos que podem conter outros comandos - como o comando composto ou o comando While do

17

exemplo - normalmente sero representados utilizando-se o padro composite. Tambm apresentado um diagrama a seguir que representa esta hierarquia.

Cdigo em Java (Composite)


public interface Componente() { void adiciona(Componente cm); void executa(); } public class Cpu implements Componente { List<Componente> lista = new ArrayList<Componente>(); int velocidade; public Cpu(int vel) { velocidade = vel; } public void adiciona(Componente cm) { lista.add(cm); } public void executa() { Iterator it = lista.iterator(); while (it.hasNext()){ it.next().executa(); } System.out.println("cpu funcionando a "+velocidade +" Ghz"); } public class Cache implements Component { int memoria; public Cache (int vel) { memoria = vel; } public { } public { } } public class Usuario { public void static main(String[] args) { void adiciona(Componente cm) void executa() System.out.println("cache com "+memoria +" MB");

18

Cache l1 = new Cache(4); Cache l2 = new Cache(2); Cpu miminx = new Cpu(5); miminx.adiciona(l1); miminx.adiciona(l1); miminx.executa(); } }

DECORATOR ( DECORADOR) Decorator, ou Wrapper, um padro de projeto de software que permite adicionar um comportamento a um objeto j existente em tempo de execuo, ou seja, agrega dinamicamente responsabilidades adicionais a um objeto. Utilizao Acrescentar responsabilidades a um objeto dinamicamente. Prover alternativa flexvel ao uso de subclasses para se estender a funcionalidade de uma classe.

Codigo em Java (Decorator)


public class DecoratorBefore { static class A { public void doIt() { System.out.print( 'A' ); } } static class AwithX extends A { public void doIt() { super.doIt(); doX(); } private void doX() { System.out.print( 'X' ); } } static class AwithY extends A { public void doIt() { super.doIt(); doY(); } public void doY() { System.out.print( 'Y' ); } } static class AwithZ extends A { public void doIt() { super.doIt(); doZ(); } public void doZ() { System.out.print( 'Z' ); } } static class AwithXY extends AwithX { private AwithY obj = new AwithY(); public void doIt() { super.doIt(); obj.doY(); } }

19

static class AwithXYZ extends AwithX { private AwithY obj1 = new AwithY(); private AwithZ obj2 = new AwithZ(); public void doIt() { super.doIt(); obj1.doY(); obj2.doZ(); } } public static void main( String[] args ) { A[] array = { new AwithX(), new AwithXY(), new AwithXYZ() }; for (int i=0; i < array.length; i++) { array[i].doIt(); System.out.print( " " ); } } }

FAADE (FACHADA) um objeto que disponibiliza uma interface simplificada para uma das funcionalidades de uma API, por exemplo. Um faade pode:

tornar uma biblioteca de software mais fcil de entender e usar; tornar o cdigo que utiliza esta biblioteca mais fcil de entender; reduzir as dependncias em relao s caractersticas internas de uma biblioteca, trazendo flexibilidade no desenvolvimento do sistema; envolver uma interface mal desenhada, com uma interface melhor definida.

Utilizao Um faade um padro de projeto (design pattern) do tipo estrutural. Os faades so muito comuns em projeto orientados a objeto. Por exemplo, a biblioteca padro da linguagem Java contm dzias de classes para processamento do arquivo fonte de um caractere, gerao do seu desenho geomtrico e dos pixels que formam este caractere. Entretanto, a maioria dos programadores Java no se preocupam com esses detalhes, pois a biblioteca contm as classes do tipo faade (Font e Graphics) que oferecem mtodos simples para as operaes relacionadas com fontes

Exemplo

20

Esse um exemplo abstrato de como um cliente ("voc") interage com um faade (o "computador") para um sistema complexo (as partes internas do computador como o processador e o disco rgido).

Codigo em Java (Faade)


/* Complex parts */ class CPU { public void freeze() { ... } public void jump(long position) { ... } public void execute() { ... } } class Memory { public void load(long position, byte[] data) { ... } } class HardDrive { public byte[] read(long lba, int size) { ... } } /* Facade */ class Computer { private CPU cpu; private Memory memory; private HardDrive hardDrive; public Computer() { this.cpu = new CPU(); this.memory = new Memory(); this.hardDrive = new HardDrive(); } public void startComputer() { cpu.freeze(); memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE)); cpu.jump(BOOT_ADDRESS); cpu.execute(); } } /* Client */ class You { public static void main(String[] args) { Computer facade = new Computer(); facade.startComputer(); } }

FLYWEIGHT

21

Um flyweight um objecto que pode ser usado em vrios contextos em simultneo. O comportamento do flyweight depende do contexto em que se encontra, no se distinguindo de um objecto no partilhado. Isto conseguido separando o estado intrnseco do estado extrnseco do objecto. O cliente responsvel por fornecer o estado extrnseco quando um flyweight necessita dele. No obrigatrio que todos os flyweight sejam partilhados

Exemplo Um exemplo o processador de texto. Cada caractere representa um objeto que possui uma famlia de fonte, um tamanho de fonte e outras informaes sobre o smbolo. Como imaginado, um documento grande com tal estrutura de dados facilmente ocuparia toda a memria disponvel no sistema. Para resolver o problema, como muitas dessas informaes so repetidas, o flyweight usado para reduzir os dados. Cada objeto de caractere contm uma referncia para outro objeto com suas respectivas propriedades.

Codigo em Java (Flyweight) const int NCHARCODES = 128; class GlyphFactory { public: GlyphFactory(); virtual ~GlyphFactory(); virtual Character* CreateCharacter(char);

22

virtual Row* CreateRow(); virtual Column* CreateColumn(); // ... private: Character* _character[NCHARCODES]; };

23

Exemplo de tabelas. TABELA 1 TTULO DA TABELA Texto de tabela Texto tabela Texto de tabela de Texto tabela Texto de tabela de Texto tabela Texto de tabela de Texto tabela Texto de tabela de Texto tabela de

Fonte: A fonte Exemplo de imagens

Figura 1 Logo

Spei

24

2. DOCUMENTOS CONSULTADOS WIKIPEDIA- <http://pt.wikipedia.org/> Acesso em: 19 Set. 2012.

S-ar putea să vă placă și