Modo compuesto en Kotlin: ejemplo de Android
Los patrones de diseño son una respuesta ampliaCPara problemas que ocurren con frecuencia en el diseño de software, se puede repetir h. Es un plano para resolver el problema y se puede utilizar en diferentes situaciones.Hay muchos patrones de diseño, pero este artículo se centra en uno, a saber Sintético Patrones de diseño.
Esta Sintético Un patrón es un patrón de diseño que permite a las clases cliente tratar un solo objeto y un grupo de objetos de la misma manera.Esta Sintético Los patrones se utilizan para expresar la jerarquía de parte y todo en el código de una manera sencilla.
La clase cliente se refiere a la clase que llama al objeto generado a partir del patrón de diseño para completar su operación.
Un ejemplo de una jerarquía parcial-total es una empresa compuesta por muchas otras empresas, a saber, Metaverse, que incluye Facebook, Messenger e Instagram. Otro ejemplo de una jerarquía parcial-total es una cartera de negocios, que puede ser una única cartera o constar de varias carteras, a saber, carteras personales, carteras familiares y carteras de acciones.
Esta Sintético Hay cuatro participantes en el modelo: Componentes, Esta hoja, Esta Sintético,así como también cliente.
- Componente: la clase principal que define la interfaz pública entre componentes. hoja y Sintético amable.
Una interfaz es una descripción de todas las operaciones y atributos que puede tener un objeto.
- Hoja: Es una clase básica que implementa Componentes Interfaz y no contiene ningún subelemento, en el caso de combinación de negocios, la hoja será una combinación única.
Implementar una interfaz significa cumplir con las convenciones de la interfaz agregando información detallada a las diferentes operaciones y atributos descritos por la interfaz.
- Compuesto: es una clase de implementación Componentes Interfaz incluida Componentes Hijos, por ejemplo, una cartera que consta de un conjunto de carteras es una Sintético.
- Cliente: es una clase que utiliza operaciones proporcionadas por el cliente. Componentes Interfaz, no te preocupes por la implementación Componentes Está en uso.Tal cliente maneja uno Componentes No es necesario saber si se está procesando hoja o SintéticoEste nivel de transparencia es muy poderoso porque nos permite pasar cualquier tipo de componentes que necesitemos, no asocia al cliente con detalles de implementación y fortalece el principio abierto / cerrado.
El principio abierto / cerrado establece que una entidad de software debe estar abierta para extensión y cerrada para modificación, es decir, dicha entidad puede permitir que su comportamiento se extienda sin modificar su código fuente.
El siguiente es un diagrama de clases de todas las estructuras.
beneficio
- Refuerza el principio abierto / cerrado, que establece que puede extender la funcionalidad de una aplicación sin modificar el código existente, porque fortalece la programación del desarrollador de la interfaz en lugar de la implementación.
- Con la ayuda del polimorfismo y la recursividad, hace que el manejo de estructuras de árbol complejas sea más fácil de administrar.
defecto
- Puede resultar difícil tener una interfaz común para un objeto diferente.
- Los patrones compuestos tienden a generalizar demasiado las cosas, lo que dificulta su comprensión.
Para este artículo, se creó una aplicación de Android de administrador de cartera simple, que demuestra el patrón compuesto. El modo compuesto se utiliza para abstraer los detalles de implementación, permitir que los clientes cambien de manera flexible y hacer que los clientes traten un portafolio único y grupos de portafolios de la misma manera.
El modo compuesto se aplicará a dos capas, el dominio y la capa de presentación. Esto nos permitirá resolver la jerarquía parte-todo desde una perspectiva de dominio y representación.
La capa de dominio es un conjunto de entidades y lógica empresarial que se utiliza para describir el modelo empresarial de la empresa.
La capa de presentación es responsable de mostrar los elementos de la interfaz de usuario y contiene la lógica de la interfaz de usuario.
En términos de campos, esperamos que, por ejemplo, el cálculo del valor total sea específico del tipo de cartera y, en términos de visualización, esperamos que los diferentes tipos de carteras tengan diferentes IU.
Capa de dominio
La siguiente figura muestra la estructura de nuestra entidad de dominio:
La estructura consta de las siguientes partes:
- Cliente: En este caso, el objeto que utiliza el componente es PortfolioComponent. Este objeto puede ser un caso de uso o un repositorio.
- PortfolioLeaf: representa un objeto Leaf, generalmente un portafolio único.
- PortfolioComposite: representa una cartera, generalmente una cartera compuesta por múltiples carteras de inversión.
- PortfolioComponent: la interfaz compartida por PortfolioLeaf y PortfolioComponent.
Una única cartera (PortfolioLeaf) solo necesita los siguientes métodos:
- getOwner: devuelve una lista de objetos de propietario que representan al propietario de la cartera.
- getValue: Devuelve el valor total de la cartera.
- getAssets: devuelve una lista de activos incluidos en la cartera.
Las carteras compuestas por otras carteras (PortfolioComposite) requieren un campo adicional llamado niños Representa las distintas carteras de inversión que constituye.
Nuestra interfaz PortfolioComponent se ve así:
Creé una clase de datos que implementa PortfolioComponent para Yehe Compound y utilizo la clase de datos para ayudarnos a generar métodos automáticamente, como igual y Código hash En Kotlin, por lo tanto, se elimina la carga de generarlos usted mismo.
Observará que esta combinación toma la lista PortfolioComponent como elementos secundarios y realiza la mayoría de los cálculos basados en estos elementos secundarios.
Para completar la capa de dominio, agregué un caso de uso para obtener la cartera de un usuario específico, una interfaz de repositorio, un propietario y una clase de datos de activos.
Capa de presentación
La capa de presentación mostrará un ViewPager para un portafolio compuesto por múltiples portafolios (Compuesto) y una vista (Hoja) para un solo portafolio. Como hice en la capa de dominio, tendré las siguientes entidades de capa de presentación para ayudarme a implementar patrones compuestos:
- PortfolioComponentView: La interfaz entre Leaf y Composite. El objeto Client llamará PortfolioComponentView, ignorando sus diferentes detalles de implementación.
- PortfolioLeafFragment: Responsable de la visualización de una única cartera.
- PortfolioCompositeFragment: Responsable de mostrar las carteras de inversión de cartera.
- MainActivity: es la representación de la clase Client en la capa de presentación.
La siguiente figura muestra la estructura de nuestra entidad de presentación:
Como puede ver, PortfolioCompositeFragment se compone de subelementos PortfolioComponentView.
Se agregó una función de extensión a la interfaz PortfolioComponent para mapear la capa de dominio a la Ir a la vista del componente de cartera, Que asigna cada tipo de cartera a su vista:
PortfolioLeafFragment y PortfolioCompositeFragment son implementaciones de PortfolioComponentView, lo que hace que nuestro código se ajuste al principio de apertura y cierre. Cuando se muestra cualquiera de las vistas, MainActivity se verá así:
La capa de presentación y la capa de dominio están conectadas a través del modelo de vista básico a continuación, que tiene una propiedad de caso de uso.
El menú adicional se utiliza para demostrar las diferentes situaciones de cualquier usuario. 1234 Tiene una sola cartera O usuario 12345 Tiene una cartera de múltiples carteras de inversión. En MainActivity, onOptionsItemSelected El método es como sigue:
Utilice MainActivity para observar el objeto LiveData para presentar la vista que se muestra a continuación.
Manifestación
Este es un video que muestra la aplicación.
En resumen, el patrón compuesto es un patrón de diseño que permite a las clases cliente tratar un solo objeto y un grupo de objetos por igual, y nos permite fortalecer algunos principios SÓLIDOS, como el principio abrir / cerrar, y facilitar su gestión. estructuras arbóreas complejas.
El código completo para este ejemplo se puede encontrar en este repositorio de GitHub: