Quais padrões de arquitetura são usados ​​no Android? [fechadas]

268

Estou fazendo uma pequena pesquisa em plataformas móveis e gostaria de saber quais padrões de design são usados ​​no Android?

por exemplo, no iOS, o Model-view-controller é muito usado em conjunto com delegação e outros padrões.

Quais padrões e onde, em particular, o Android usa?

EDITAR

Não estou solicitando padrões de design usados ​​profundamente no kernel, dalvik e assim por diante, mas sobre padrões que um desenvolvedor de aplicativos encontrará ao desenvolver um aplicativo.

Burjua
fonte
2
Dado que a plataforma Android incorpora um kernel Linux, é um conjunto de softwares muito grande para responder a essa pergunta além de 'todos os padrões mencionados até agora e provavelmente alguns novos se você observar com cuidado'
Pete Kirkham
5
@Pete, Ok, provavelmente você está certo, mas ao mesmo tempo não estou tão profundo quanto o kernel, estou interessado na superfície da aplicação, por exemplo, no iOS UIViewControllerimplementado usando MVC ( UIViewControlleré um controlador e sua raiz UIViewé vista) , UIApplicationusa delegação tendo Application Delegate como delegado e assim por diante ...
Burjua
4
Eu acho que você realmente deve aprender o Android de baixo para cima e não tentar "portar" seu conhecimento do iOS para o Android. Existem muitos livros excelentes por aí. Apress faz um monte. Se você entende o ciclo de vida do aplicativo e do serviço no Android, deve saber como desing aplicativos corretamente.
blindstuff
Isso pode ajudar: stackoverflow.com/a/49694378
Ali Nem

Respostas:

324

Tentei usar os padrões de arquitetura model-view-controller (MVC) e model-view-apresentador para desenvolver o android. Minhas descobertas são de que o modelo-visualização-controlador funciona bem, mas existem alguns "problemas". Tudo se resume a como você percebe a Activityclasse Android . É um controlador ou é uma visão?

A Activityclasse real não estende a Viewclasse do Android , mas, no entanto, lida com a exibição de uma janela para o usuário e também com os eventos dessa janela (onCreate, onPause, etc.).

Isso significa que, quando você estiver usando um padrão MVC, seu controlador será realmente um pseudo-controlador de exibição. Como ele está manipulando a exibição de uma janela para o usuário, com os componentes de exibição adicionais adicionados a você com setContentView, e também manipulando eventos para pelo menos os vários eventos do ciclo de vida da atividade.

No MVC, o controlador deve ser o principal ponto de entrada. O que é um pouco discutível se esse for o caso ao aplicá-lo ao desenvolvimento do Android, pois a atividade é o ponto de entrada natural da maioria dos aplicativos.

Por isso, eu pessoalmente acho que o padrão de modelo-visualização-apresentador é o ajuste perfeito para o desenvolvimento do Android. Como o papel da visualização nesse padrão é:

  • Servindo como ponto de entrada
  • Componentes de renderização
  • Roteando Eventos do Usuário para o Apresentador

Isso permite que você implemente seu modelo da seguinte maneira:

Ver - contém os componentes da interface do usuário e lida com eventos para eles.

Apresentador - isso manipulará a comunicação entre seu modelo e sua visualização, veja-a como uma porta de entrada para seu modelo. Ou seja, se você tem um modelo de domínio complexo representando, Deus sabe o que, e sua visão precisa apenas de um subconjunto muito pequeno desse modelo, o trabalho dos apresentadores é consultar o modelo e atualizar a visão. Por exemplo, se você tem um modelo que contém um parágrafo de texto, um título e uma contagem de palavras. Mas em uma determinada exibição, você só precisa exibir o título na exibição. Em seguida, o apresentador lerá os dados necessários no modelo e atualizará a visualização de acordo.

Modelo - este deve ser basicamente o seu modelo de domínio completo. Espero que ajude a tornar seu modelo de domínio mais "rígido" também, já que você não precisará de métodos especiais para lidar com casos, como mencionado acima.

Ao desacoplar o modelo da visualização todos juntos (através do uso do apresentador), também se torna muito mais intuitivo testar seu modelo. Você pode ter testes de unidade para o seu modelo de domínio e testes de unidade para seus apresentadores.

Experimente. Eu, pessoalmente, acho uma ótima opção para o desenvolvimento do Android.

JustDanyul
fonte
14
Ótima resposta! No entanto, tenho perguntas: 1. Atividade = Visão, eu entendi direito? 2. Você implementaria o apresentador como sua própria classe pública ou como uma classe interna da Atividade? Ou um fragmento (também classe interna)? 3. Você quer dizer que as classes de transferência devem ser usadas como em vez das classes de modelo reais na Atividade (exibição)?
manmal
14
1. Sim, eu os uso como visualizações no padrão MVP. 2. pessoalmente, eu os segmento em classes públicas individuais, mas acho que é uma questão de gosto :) 3. Expliquei isso muito mal, a frase "encaminhar as classes necessárias" é enganosa. O que quero dizer é que o apresentador senta-se entre a visualização e o modelo, lê o modelo e atualiza a visualização. Vou atualizar a minha resposta a ser um pouco mais claro :)
JustDanyul
Obrigado por tomar o tempo, eu obtê-lo agora :)
manmal
11
Na verdade, eu realmente amo o desenvolvimento do Android porque é altamente desacoplado. Como uso o MVC: use as atividades exclusivamente para as E / S do usuário e use um serviço local para todo o seu processamento. Quando o serviço quiser mostrar algo - transmita-o para suas atividades! Eu realmente odeio quando outros desenvolvedores colocam muito processamento nas atividades.
Alguém em algum lugar
8
@SomeoneSomewhere, por que não ter uma classe que lida com esse material em thread separado / AsyncTasks, por que um serviço?
Boy
87

Atualização novembro 2018

Depois de trabalhar e escrever blogs sobre MVC e MVP no Android por vários anos (veja o corpo da resposta abaixo), decidi capturar meu conhecimento e entendimento de uma forma mais abrangente e de fácil digestão.

Então, lancei um curso em vídeo completo sobre a arquitetura de aplicativos Android. Portanto, se você estiver interessado em dominar os padrões arquiteturais mais avançados no desenvolvimento do Android, confira este curso abrangente aqui .

Esta resposta foi atualizada para permanecer relevante em novembro de 2016


Parece que você está procurando padrões de arquitetura em vez de padrões de design .

Os padrões de design visam descrever um "truque" geral que o programador pode implementar para lidar com um conjunto específico de tarefas recorrentes de software. Por exemplo: No OOP, quando há a necessidade de um objeto notificar um conjunto de outros objetos sobre alguns eventos, o padrão de design do observador pode ser empregado.

Como os aplicativos Android (e a maioria do AOSP) são escritos em Java, que é orientado a objetos, acho que é difícil procurar um único padrão de design OOP que NÃO seja usado no Android.

Os padrões arquiteturais , por outro lado, não abordam tarefas específicas de software - eles visam fornecer modelos para a organização de software com base nos casos de uso do componente de software em questão.

Parece um pouco complicado, mas espero que um exemplo esclareça: Se algum aplicativo for usado para buscar dados de um servidor remoto e apresentá-los ao usuário de maneira estruturada, o MVC poderá ser um bom candidato a ser considerado. Observe que eu não disse nada sobre tarefas de software e fluxo de programa do aplicativo - acabei de descrevê-lo do ponto de vista do usuário e surgiu um candidato a um padrão arquitetural.

Como você mencionou o MVC em sua pergunta, eu acho que os padrões arquiteturais são o que você está procurando.

Digite a descrição da imagem aqui


Historicamente, não havia diretrizes oficiais do Google sobre arquiteturas de aplicativos, o que (entre outros motivos) levou a uma bagunça total no código-fonte dos aplicativos Android. De fato, ainda hoje a maioria dos aplicativos que eu vejo ainda não segue as práticas recomendadas de OOP e não mostra uma organização lógica clara do código.

Hoje, porém, a situação é diferente - o Google lançou recentemente a biblioteca Data Binding , totalmente integrada ao Android Studio e, inclusive, lançou um conjunto de projetos de arquitetura para aplicativos Android .

Dois anos atrás, era muito difícil encontrar informações sobre MVC ou MVP no Android. Hoje, MVC, MVP e MVVM se tornaram "palavras-chave" na comunidade Android, e estamos cercados por inúmeros especialistas que constantemente tentam nos convencer de que o MVx é melhor que o MVy. Na minha opinião, discutir se o MVx é melhor que o MVy é totalmente inútil, porque os termos em si são muito ambíguos - basta olhar para as respostas a essa pergunta e você perceberá que pessoas diferentes podem associar essas abreviações a construções completamente diferentes.

Devido ao fato de ter sido oficialmente iniciada uma busca pelo melhor padrão arquitetural para Android, acho que estamos prestes a ver várias outras idéias surgindo. Nesse ponto, é realmente impossível prever quais padrões (ou padrões) se tornarão os padrões do setor no futuro - precisaremos esperar e ver (acho que é questão de um ano ou dois).

No entanto, há uma previsão que posso fazer com um alto grau de confiança: O uso da biblioteca de Ligação de Dados não se tornará um padrão do setor. Estou confiante em dizer isso porque a biblioteca Data Binding (em sua implementação atual) fornece ganhos de produtividade a curto prazo e algum tipo de diretriz de arquitetura, mas tornará o código não sustentável a longo prazo. Depois que os efeitos a longo prazo desta biblioteca surgirem, ela será abandonada.


Agora, embora tenhamos hoje algum tipo de diretrizes e ferramentas oficiais, eu, pessoalmente, não acho que essas diretrizes e ferramentas sejam as melhores opções disponíveis (e elas definitivamente não são as únicas). Nos meus aplicativos, uso minha própria implementação de uma arquitetura MVC. É simples, limpo, legível e testável, e não requer nenhuma biblioteca adicional.

Esse MVC não é apenas cosmeticamente diferente dos outros - é baseado em uma teoria de que as atividades no Android não são elementos da interface do usuário , o que tem tremendas implicações na organização do código.

Portanto, se você estiver procurando por um bom padrão de arquitetura para aplicativos Android que siga os princípios do SOLID , poderá encontrar uma descrição de uma no meu post sobre padrões de arquitetura MVC e MVP no Android .

Vasiliy
fonte
2
Bem feito por fornecer esses recursos! Obrigado!
Aleksandar
1
Links muito úteis!
Semaphor
Eu gosto do seu curso em vídeo! Obrigado
Viktor Apoyan
79

insira a descrição da imagem aqui

Quando chego a este post, ele realmente me ajuda a entender padrões com exemplo, por isso criei a tabela abaixo para ver claramente os padrões de Design e seu exemplo no Android Framework

Espero que você ache útil.

Peter Walter
fonte
4
Por favor editar o seu post e mostrar o conteúdo real como texto em vez de imagens. Outros não podem copiar e colar suas imagens ou ajudá-lo a corrigir seus erros de digitação. Veja aqui para detalhes. Obrigado.
Pang
1
Obrigado por esta resposta. Eu estava tão confuso entre padrões de arquitetura e padrões de design que ainda tenho uma pergunta: o que é design e desenvolvimento !? @Peter Walter
Rucha Bhatt Joshi
Eu voto esta resposta porque, embora a pergunta do @Burjua mencione padrões de design fazendo referência a arquiteturas, eles não são os mesmos. Eu considero esta resposta muito informativo e complementar à pergunta inicial
Xaren
Ônibus evento usa editor e assinante padrão de design
Devrath
48

Existem vários padrões usados ​​na estrutura do Android, como:

  • O receptor de transmissão usa o padrão Observer
  • A chamada de serviço do Remoter usa o padrão Proxy
  • Exibir e exibir grupos usa padrão Composto
  • A estrutura de mídia usa o padrão Facade
yash
fonte
5
você pode por favor por favor, compartilhe as ligações (referências)
shanraisshan
por favor, compartilhe a referência para que eu possa descobrir mais sobre isso. Obrigado
Syed Hamza Hassan
27

Aqui está um ótimo artigo sobre Common Design Patterns para Android :

Padrões criacionais:

  • Construtor (por exemplo, AlertDialog.Builder )
  • Injeção de Dependência (por exemplo, Adaga 2 )
  • Singleton

Padrões estruturais:

  • Adaptador (por exemplo, RecyclerView.Adapter )
  • Fachada (por exemplo, Retrofit )

Padrões comportamentais:

  • Comando (por exemplo, EventBus )
  • Observador (por exemplo, RxAndroid )
  • Model View Controller
  • Model View ViewModel ( semelhante ao padrão MVC acima )
Ineta
fonte
1
Os pontos principais do artigo seriam agradáveis.
Maxim G
Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
Bhargav Rao
Ônibus evento usa editor e assinante padrão de design
Devrath
16

As seguintes classes do Android usam padrões de design

1) View Holder usa Singleton Design Pattern

2) Intenção usa Padrão de Design de Fábrica

3) O adaptador usa o Padrão de Design do Adaptador

4) O Broadcast Receiver usa o Observer Design Pattern

5) View usa Composite Design Pattern

6) O Media FrameWork usa o Padrão de design de fachada

Jacob Abraham
fonte
11

No caso Notificações , o Padrão do ConstrutorNotificationCompat.Builder usa

gostar,

mBuilder = new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.ic_stat_notification)
                    .setContentTitle(getString(R.string.notification))
                    .setContentText(getString(R.string.ping))
                    .setDefaults(Notification.DEFAULT_ALL);
Jeff T.
fonte
3
Este é realmente o padrão do Builder.
Piovezan
@Piovezan, eu estou errado. Obrigado por me corrigir. Eu pensei que era uma versão simples do Decorator Pattern.
Jeff T.
6

O Android também usa o padrão de design do ViewHolder.

É usado para melhorar o desempenho de um ListView enquanto o rola.

O padrão de design do ViewHolder permite acessar cada exibição de item de lista sem a necessidade de pesquisa, economizando valiosos ciclos do processador. Especificamente, evita chamadas freqüentes de findViewById () durante a rolagem do ListView, e isso facilitará.

amarnathpatel
fonte
5

Todos esses padrões, MVC, MVVM , MVP e modelo de apresentação , podem ser aplicados a aplicativos Android, mas sem uma estrutura de terceiros, não é fácil obter uma estrutura bem organizada e um código limpo.

O MVVM é originário do PresentationModel. Quando aplicamos MVC, MVVM e Modelo de Apresentação a um aplicativo Android, o que realmente queremos é ter um projeto estruturado claro e, mais importante, mais fácil para testes de unidade.

No momento, sem uma estrutura de terceiros, você geralmente possui muitos códigos (como addXXListener (), findViewById () etc.), que não agregam valor comercial. Além disso, você precisa executar testes de unidade Android em vez de testes JUnit normais, que levam anos para serem executados e tornam os testes unitários um pouco impraticáveis.

Por esses motivos, alguns anos atrás, começamos um projeto de código aberto, RoboBinding - Uma estrutura de modelo de apresentação de ligação de dados para a plataforma Android. O RoboBinding ajuda a escrever um código de interface do usuário mais fácil de ler, testar e manter. O RoboBinding elimina a necessidade de código desnecessário, como o addXXListener , e muda a lógica da interface do usuário para o Presentation Model, que é um POJO e pode ser testado através de testes JUnit normais . O próprio RoboBinding vem com mais de 300 testes JUnit para garantir sua qualidade.

Cheng
fonte
1

No Android, o padrão "processador da fila de trabalho" é comumente usado para descarregar tarefas do encadeamento principal de um aplicativo.

Exemplo: O design da classe IntentService.

O IntentService recebe os Intents, inicia um thread de trabalho e interrompe o serviço conforme apropriado. Todas as solicitações são tratadas em um único thread de trabalho.

amarnathpatel
fonte
0

O Fichário usa "Padrão do Observador" para notificações de Destinatário da Morte.

Vinodh
fonte