- Identifique os aspectos de seu aplicativo que variam e separe-os do que permanece igual
- Programe para uma interface, não para uma implementação
- Dar prioridade à composição
- Busque designs levemente ligados entre objetos que interagem
- As classes devem estar abertas para extensão, mas fechadas para modificação.
- Dependa de abstrações. Não dependa de classes concretas (Dependency Inversion Principle)
- Padrão STRATEGY: define uma família de algoritmo, encapsula cada um deles e os torna intercambiaveis. A estratégia deixa o algoritmo variar independentemente dos clientes que o utilizam.
- Padrão OBSERVER: define a dependênia um-para-muitos entre objetos para que quando um objeto mude de estado todos os seus dependentes sejam avisados e autalizados automaticamente.
- Padrão DECORATOR: anexa responsabilidade adicionais a um objeto dinamicamente. Os decoradores fornecem uma alternativa flexível de subclasse para estender a funcionalidade.
- Padrão FACTORY METHOD: define uma interface para criar um objeto, mas permite às classes decidir qual classe instanciar. O Factory method permite a uma classe deferir a instanciação para subclasses.
- Padrão ABSTRACT FACTORY: fornece uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas.
- Abstração
- Encapsulamento
- Polimorfismo
- Herança