Expert (padrão de projeto de software)
# Expert (padrão de projeto de software)

Especialista na Informação (ou Especialista da Informação, ou apenas Especialista, ou ainda seus equivalentes em inglês Information Expert e Expert) é um padrão de projeto de software, parte do conjunto de princípios conhecido como GRASP (General Responsibility Assignment Software Patterns). É uma abordagem genérica que visa atribuir a responsabilidade de fazer ou conhecer algo ao "especialista na informação" — a classe que possui a informação necessária para cumprir tal responsabilidade.

## Funcionamento
### Obrigações de fazer algo

* Fazer algo a si mesmo
* Iniciar ações em outros objetos
* Controlar ou coordenar atividades em outros objetos

### Obrigações de conhecer algo

* Conhecer dados encapsulados
* Conhecer objetos relacionados
* Conhecer coisas que se pode calcular

## Exemplos

Uma classe Venda possui a informação de uma venda composta por um ou mais itens. Cada item é representado pela classe ItemVendido, que pode ser composta por um objeto da classe Produto (que, por sua vez, possui a informação do seu preço unitário) e a quantidade vendida.
Para calcular o total da venda dos itens, a classe Venda poderia primeiro calcular os subtotais dos itens obtendo os preços unitários da classe Produto por meio da classe ItemVendido e as respectivas quantidades, e por fim somar os subtotais.
Entretanto, segundo o padrão Especialista, a modelagem adequada é passar para a classe ItemVendido a responsabilidade de calcular seus próprios subtotais, uma vez que ela possui (ou pode obter) as informações necessárias. A classe Venda é, por sua vez, a responsável por obter os subtotais dos objetos da classe ItemVendido e somá-los, calculando assim o total da venda.
Portanto, o especialista em informar os preços unitários é a classe Produto, o especialista em calcular os subtotais é a classe ItemVendido e o especialista em calcular o total da venda é a classe Venda.