Delegate Design Pattern
O Pattern Delegate é utilizado para separar contextos e, literalmente, delegar responsabilidades.
Conceito
No padrão Delegate, um objeto delga a responsabilidade de executar uma determinada tarefa e as especialidades da implementação não importa para essa classe "delegadora".
O objeto principal possui uma referência ao delegate, usando um protocolo. Dessa forma, o delegate implementa os métodos do protocolo para realizar a tarefa.
Objetivos principais
- Desacoplamento: Permite que diferentes classes ou componentes trabalhem juntos sem que conheçam diretamente suas implementações.
- Reutilização de código: Componentes podem ser reutilizados com diferentes delegados, fornecendo maior flexibilidade.
- Especialização: Permite que diferentes objetos especializados realizem diferentes tarefas sem modificar o objeto principal.
Estrutura básica
- Protocolo (interface): Define os métodos que o delegado deve implementar.
- Objeto principal: É o objeto que precisava realizar alguma ação, mas delega a tarefa ao delegado.
- Objeto delegado: É o objeto que realmente executa a ação em nome do principal.
Pseudocódigo
classDiagram
class DelegateProtocol {
<<protocol>>
+doSomething()
}
class Main {
-delegate: DelegateProtocol
+mainMethod()
}
class Delegate {
+doSomething()
}
Main --> DelegateProtocol : delegate
Delegate ..|> DelegateProtocol : implements
interface DelegateInterface is
method doSomething()
class Main
field delegate: DelegateInterface?
method mainMethod() is
print("Starting task")
delegate?.doSomething()
class Delegate implements DelegateInterface
method doSomething() is
print("Doing somehting as delegate")
main = Main()
delegate = Delegate()
main.delegate = delegate
main.mainMethod()
Vantagens
- Separação de responsabilidades: A delegação permite que a lógica de uma tarefa seja separada em outra classe.
- Modularização: A delegação permite que o código seja quebrado em partes menores e mais gerenciáveis.
- Facilidade de substituição: O comportamento delegado pode ser facilmente substituído sem alterar o objeto principal.
- Facilita testes: Ao usar delegates, é possível simular comportamentos para realizar testes sem ter que alterar o código original.
- Extensibilidade: O delegate permite que uma funcionalidade seja estendida, caso a implementação do protocolo lide de forma diferente com a delegação de responsabilidade.
Referências
Replace Inheritance with Delegation Omar Saibaa, Delegate Design Pattern in iOS
Esse é um dos meus patterns favoritos, trabalho dando manutenção em um framework atualmente e quase sempre que me deparo com uma situação onde preciso estender a funcionalidade ou padronizar alguma biblioteca de terceiros o delegate está lá para ser a solução do problema
bom dia, sra.
este pattern corrobora para com o L com o I do solid, certo?
as referências que vc apresentou não apresentam referências bibliográficas tais literaturas com escopo acadêmico. a sra já viu esse pattern na faculdade? estou comentando sobre isso, pois eu queria entender com quais paradigmas esse pattern é mais amigável. talvez o funcional, tal quando orientado a protótipos, como o javascript.
já utilizou esse pattern antes? poderia trazer um exemplo prático?
pode até ser um aprofundamento para outro post.
além disso, como a sra colocou um diagrama no markdown? ficou bacana.
aguardo retorno.
Po, interessante, consegue mostrar um exemplo comparativo? Tipo, uma situação "problema" que isso aí consiga resolver / melhorar a performance (se for o objetivo)
Parabéns, muito legal 👏👏👏👏👏👏