A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Design Patterns Estudo de Caso: um editor de documentos.

Apresentações semelhantes


Apresentação em tema: "Design Patterns Estudo de Caso: um editor de documentos."— Transcrição da apresentação:

1 Design Patterns Estudo de Caso: um editor de documentos

2 Motivação u Será apresentado o uso de design patterns no projeto de um editor WYSIWYG; u O estudo de caso se concentrará na estrutura do documento manipulado pelo editor.

3 Estrutura do documento u Um documento é um conjunto de elementos gráficos, tais como caracteres, linhas polígonos e outras formas; u Estas subestruturas devem ser manipuladas diretamente. Por exemplo, um diagrama deve ser tratado como uma unidade e não como uma coleção de primitivas gráficas básicas; u Os elementos devem ser tratados de forma uniforme.

4 Estrutura do documento u Pode ser representada por meio de composição recursiva; u Existirão então classes atômicas e classes recursivas.

5 Estrutura do documento Grafico CaracterRetânguloLinha Draw(Window) Intersects(Point) Insert(Glyph, int)... Draw(Window w) Intersects(Point p)... char c Draw(...) Intersects(...)... Draw(Window w) Intersects(Point p) Insert(Grafico g, int i)... w->DrawCharacter(c) Return true if point p intersects this character Insert g into children at position i children For all c in children if c->Intersects(p) return true

6 Estrutura do documento: Gráfico u É uma classe abstrata para todos os objetos gráficos que aparecem na estrutura do documento; u As subclasses definem elementos gráficos primitivos (ex: caracter, retângulo, etc.) e elementos estruturados (ex: linha); u São necessárias operações para inserir, remover e acessar os filhos de um gráfico.

7 O Pattern Composite u Para representar a estrutura do documento, foi utilizado o padrão estrutural composite; u Este padrão pode ser utilizado para representar qualquer estrutura hierárquica potencialmente complexa.

8 O Padrão Composite u Objetivo –Compõe objetos em estruturas de árvore para representar hierarquias do tipo todo-parte. Permite que os clientes tratem objetos individuais e composições de maneira uniforme.

9 O Pattern Composite u Motivação –O problema do editor apresentado anteriormente. –Um objeto típico seria: aLine aRetânguloaLineaChar aRetângulo

10 O Pattern Composite u Aplicabilidade –Use este padrão quando: »precisar representar hierarquias do tipo todo-parte; »quiser que os clientes ignorem as diferenças entre as composições e os objetos atômicos. Os clientes irão tratar todos os objetos da estrutura de maneira uniforme.

11 O Pattern Composite Leaf Operation() Add(Component) Remove(Component) GetChild(int) Operation() children Client Composite Operation() Add(Component) Remove(Component) GetChild(int) Component For all g in children g.Operation(); u Estrutura

12 O Pattern Composite u Participantes –Component »declara a interface dos objetos na composição; »implementa comportamento “default” para a interface comum a todas as classes; »declara a interface para acessar e manipular os componentes “filhos”; »opcionalmente, define a interface para acessar o “pai” de um componente na estrutura recursiva.

13 O Pattern Composite u Participantes (cont.) –Leaf (folha) »representa objetos atômicos na composição. Uma folha não tem “filhos”; »define o comportamento para objetos primitivos na composição.

14 O Pattern Composite u Participantes –Composite »define o comportamento para componentes que têm “filhos”; »armazena os “filhos”; »implementa operações relacionadas aos filhos na interface do componente; –Client »manipula objetos na composição através da interface do componente.

15 O Pattern Composite u Colaborações –Clientes usam a interface das classes componentes para interagir com os objetos na estrutura de composição. Se o recipiente de uma mensagem é uma folha, a solicitação é manipulada diretamente. Se o recipiente é um “Composite”, a solicitação é enviada para os seus filhos, e possivelmente, outras operações serão executadas antes e/ou depois da mensagem ser “forwarded”.

16 O Pattern Composite u Conseqüências –define hierarquias de classes consistindo de objetos primitivos e compostos. Objetos primitivos podem ser combinados de forma a criar objetos compostos mais complexos, de forma recursiva. Em todo lugar onde o cliente espera por um objeto primitivo, ele pode receber um objeto composto; –faz com que o cliente se torne mais simples. Clientes podem tratar estruturas compostas e objetos individuais de maneira uniforme. Clientes normalmente não sabem (e não devem se importar) se estão manipulando uma folha ou um componente composto. Isto simplifica o código do cliente, porque evita ter que escrever comandos do tipo “tag-and-case” sobre as classes que definem a composição; –torna mais fácil a adição de novos componentes. Clientes não necessitam ser alterados quando novos componentes são inseridos na estrutura composta.

17 O Pattern Composite u Implementação (algumas considerações) –Referências explícitas ao pai: manter referências dos componentes filhos para os componentes pais pode simplificar o caminhamento e o gerenciamento de uma estrutura composta. A referência ao pai simplifica o movimento para cima em uma estrutura e a remoção de um componente. –O local correto para definir a referência ao pai é na classe Component. Leaf e Composite podem então herdar a referência e a operação que a manipula. –Com a referência ao pai, é essencial manter o invariante de que todos os filhos de uma composição têm como pai a composição que os tem como filhos.

18 O Pattern Composite u Implementação (cont.) –Qual a melhor estrutura para armazenar componentes? Os componentes filhos podem ser armazenados em listas ligadas, árvores, arrays ou tabelas hash. A escolha depende da eficiência desejada.

19 O Pattern Composite u Exemplo de Código –Equipamentos tais como computadores e sistemas de som são freqüentemente organizados em estruturas todo-parte. Por exemplo, o chassis pode conter o drive e as placas, o gabinete pode conter o chassis, etc. Estas estruturas podem ser naturalmente modeladas usando o pattern Composite.

20 O Pattern Composite u Exemplo de Código (cont.) –A classe Equipement define uma interface comum a todos os equipamentos na hierarquia todo-parte. class Equipement { public: virtual ~Equipement(); const char* Name() {return _name;} virtual Watt Power(); virtual Currency NetPrice(); virtual Currency DiscountPrice(); virtual void Add(Equipement)*); virtual void Remove(Equipement*); virtual Iterator * CreateIterator(); protected: Equipement(const char*); private: const char* _name; }

21 O Pattern Composite u Exemplo de Código (cont.) –Equipement declara operações que retornam atributos de uma parte de um equipamento, tal como o seu consumo de energia e o custo. Subclasses implementam estas operações para tipos específicos de equipamento. Equipement também declara uma operação CreateIterator que retorna um Iterator para acessar suas partes.

22 O Pattern Composite u Exemplo de Código (cont.) –Subclasses de Equipement podem incluir classes do tipo Leaf que representam drives de disco, circuitos integrados e switches. class FloppyDisk: public Equipement { public: FloppyDisk(const char*); virtual ~FloppyDisk(); virtual Watt Power(); virtual Currency NetPrice(); virtual Currency DiscountPrice(); };

23 O Pattern Composite u Exemplo de Código (cont.) –CompositeEquipement é a classe base para equipamentos que contêm outros equipamentos. Ela também é uma subclasse de Equipement. class CompositeEquipement: Public Equipement { public: virtual ~CompositeEquipement(); virtual Watt Power(); virtual Currency NetPrice(); virtual Currency DiscountPrice(); virtual void Add(Equipement*); virtual void Remove(Equipement*); virtual Iterator * CreateIterator(); protected: CompositeEquipement(const char*); private: List _equipement; };

24 O Pattern Composite u Exemplo de Código (cont.) –CompositeEquipement define as operações para acessar e manipular subequipamentos. As operações Add e Remove inserem e deletam equipamentos da lista de equipamentos armazenada no atributo _equipement. A operação CreateIterator retorna um Iterator (especificamente uma instância de ListIterator) que será usado para navegar na lista de equipamentos.

25 O Pattern Composite u Exemplo de Código (cont.) –A implementação default da operação NetPrice pode usar CreateIterator para somar os preços líquidos de cada subequipamento. Currency CompositeEquipement::NetPrice() { Iterator * i = CreateIterator(); for (i->First(); !i->IsDone(); i->Next()) { total += i->CurrentItem()->NetPrice(); } delete i; return total; }

26 O Pattern Composite u Exemplo de Código (cont.) –O componente chassis pode então ser definido como uma subclasse de CompositeEquipement. class Chassis: public CompositeEquipement { public: Chassis(const char*); virtual ~Chassis(); virtual Watt Power(); virtual Currency NetPrice(); virtual Currency DiscountPrice(); };

27 O Pattern Composite u Exemplo de Código (cont.) –Outros equipamentos, tais como Gabinete, podem ser definidos de forma similar. Os equipamentos podem ser então montados da seguinte forma: Gabinete* gabinete = new Gabinete(“PC Cabinet”); Chassis* chassis = new Chassis(“PC Chassis”); gabinete->Add(chassis); chassis->Add(new FloppyDisk(“3.5in Floppy”)); cout NetPrice();

28 O Pattern Composite u Usos Conhecidos –Exemplos do pattern Composite podem ser encontrados em quase todos os sistemas orientados a objetos.

29 O Pattern Composite u Patterns Relacionados –Iterator pode ser usado para navegar através dos componentes; –etc.


Carregar ppt "Design Patterns Estudo de Caso: um editor de documentos."

Apresentações semelhantes


Anúncios Google