Professional Documents
Culture Documents
Design Patterns
Agenda
• Definições
• Princípios
• Anti-padrões
• Padrões de projeto
– Bridge
– Observer
Design Patterns
Definição
• Soluções Compartilhadas
• Construídas em grupo
Design Patterns
Três princípios de problemas
Agile Software Development: Principles, Patterns, and Practices by Robert Martin
• Rigidez
Dificuldade de mudança visto que cada mudança afeta muitas partes
do sistema
• Fragilidade
Após fazer uma mudança, alguns outros módulos do sistema passam
a não funcionar
• Imobilidade
Dificuldade de reuso em outro aplicativo
Design Patterns
Princípios
• Open Close Principle
“Open for extension but closed for modifications”
• Blob
Quando uma classe domina a nossa aplicação
• Lava Flow
Fragmentos de código que fluem vagamente numa
aplicação com o decorrer do tempo
• Golden Hammer
Conhecedor de apenas uma técnica X e molda cada
problema até que estes se encaixam no seu padrão X
• Spaghetti Code
Sistemas com pouca estrutura, com um número reduzido
de classes e métodos grandes
Anti Design Patterns
Arquiteturais
• Vendor Lock-In
Construção de sistemas que são altamente dependentes de interfaces
proprietárias
• Design by Committee
Muita gente trabalhando junto para projetar a mesma arquitetura sem um
método bem organizado. Conseqüência: arquitetura excessivamente
complexa para atender a todas as diferentes opiniões e pontos de vista.
• Analysis Paralysis
Analistas buscam o entendimento perfeito e completo do
problema
• Death by Planning
Excesso no planejamento do que se vai fazer
• Intellectual Violence
Utilização prepotente de um conhecimento sobre uma
determinada teoria, tecnologia ou jargão específico para intimidar
outras pessoas numa reunião
Factory method Define an interface for creating an object, but let subclasses decide
which class to instantiate. Factory Method lets a class defer
instantiation to subclasses.
Multiton Ensure a class has only named instances, and provide global point of
access to them.
Singleton Ensure a class has only one instance, and provide a global point of
access to it.
Design Patterns
Estruturais
Adapter or Convert the interface of a class into another interface clients expect. Adapter
lets classes work together that couldn't otherwise because of incompatible
Wrapper interfaces.
Bridge Decouple an abstraction from its implementation so that the two can vary
independently.
Proxy Provide a surrogate or placeholder for another object to control access to it.
Design Patterns
Comportamentais
Blackboard Generalized observer, which allows multiple readers and writers. Communicates
information system-wide.
Chain of responsibility Avoid coupling the sender of a request to its receiver by giving more than one
object a chance to handle the request. Chain the receiving objects and pass the
request along the chain until an object handles it.
Command Encapsulate a request as an object, thereby letting you parameterize clients
with different requests, queue or log requests, and support undoable
operations.
Interpreter Given a language, define a representation for its grammar along with an
interpreter that uses the representation to interpret sentences in the language.
Iterator Provide a way to access the elements of an aggregate object sequentially
without exposing its underlying representation.
Mediator Define an object that encapsulates how a set of objects interact. Mediator
promotes loose coupling by keeping objects from referring to each other
explicitly, and it lets you vary their interaction independently.
Memento Without violating encapsulation, capture and externalize an object's internal
state so that the object can be restored to this state later.
Null Object Designed to act as a default value of an object.
Observer or Define a one-to-many dependency between objects so that when one object
changes state, all its dependents are notified and updated automatically.
Publish/subscribe
Restorer An alternative to the existing Memento pattern.
State Allow an object to alter its behavior when its internal state changes. The object
will appear to change its class.
Strategy Define a family of algorithms, encapsulate each one, and make them
interchangeable. Strategy lets the algorithm vary independently from clients
that use it.
Template method Define the skeleton of an algorithm in an operation, deferring some steps to
subclasses. Template Method lets subclasses redefine certain steps of an
algorithm without changing the algorithm's structure.
Visitor Represent an operation to be performed on the elements of an object structure.
Visitor lets you define a new operation without changing the classes of the
elements on which it operates.
Bridge
• Motivação
– Abstração com diferentes implementações
– Tanto a abstração quanto as implementações podem evoluir
• Cenários
– Camada de persistência
– Consultas em bases heterogêneas
– Renderização de GUI
• Objetivo
– Desacoplar a abstração da suas implementações
Bridge
Abstraction:
Interface da abstração. Algumas literaturas mostram a interface com a
referência ao Implementor.
AbstractionImpl:
A implementação da abstração na qual referencia e invoca o
implementador
Implementor:
A interface para a implementação. Nem sempre corresponde a interface
Abstraction.
ConcreteImplementor N:
Bridge
Camada de Persistência
Bridge
QueryManager
Observer
• Motivação
– Manter estado consistente entre os módulos do sistema
– Refletir mudança de estado em módulos do sistema
• Cenários
– MVC
– Gerência de eventos (GUI)
– ...
• Objetivo
– Reduzir o acoplamento e as dependências nas mudanças de
estados
– Permitir que no futuro mais módulos possam ser adicionados ou
removidos garantindo a consistência de estado
– Permitir a mudança de estado de objetos desconhecidos
Observer
Subject:
Classe que é observada e conhece seus “observadores”.
Deve fornecer uma interface para anexar e desanexar os seus “observadores” .
Observer :
Define a interface de mudança de estado para os objetos que devem ser notificados
da mudança de estado no subject.
ConcreteSubject :
Implementação do subject que possui os estados para os objetos de ConcreteObserver
Envia a notificação para todos os seus observadores quando ocorre uma mudança de seu estado.
ConcreteObserver:
Mantém uma referência para o ConcreteSubject para reconhecer a mudança de estado.
Dependendo da interface (parâmetros da notificação), não precisa ter referência para o Subject.