Patrones de decorador en el desarrollo de Android | Autor: Dens Rebrov | Octubre de 2021
Decorator es un gran patrón, en muchos casos, puede separar mejor parte de la lógica de empaquetado o de acompañamiento de la parte central del sistema.
Decorador Tipo de abstracción al mismo tiempo:
- sí Tipo de abstracción (Implementar su interfaz)
- ya Tipo de abstracción (Referido a alguna otra Tipo de abstracción Objetivo)
Entonces, el decorador se puede envolver Tipo de abstracción Comportamiento y agregue algo de lógica antes y después de su método de destino.
Puedes leer más sobre decoradores aquí.
🌲 Decoradores en Kotlin
Kotlin nos permite usar decoradores de una manera conveniente y concisa a través del uso de delegación by
Palabras clave.
abstract class AbstractType
abstract fun foo()
abstract fun bar()
class Decorator(target: AbstractType): AbstractType by target
//no errors regardless of AbstractType unimplemented members
El uso de delegados nos permite omitir la cobertura de todos los miembros abstractos, lo que hace que nuestro código sea más limpio.
💉 Decorador con DI
Decoración unoUna especie deLa ventaja de tor es que puede definir dónde usar objetos de clase primitivos, decoradores o pilas de decoradores mediante la inyección de dependencias.
DI facilita el control de este comportamiento y separa el código relacionado con el decorador de la lógica central y lo conecta solo en el módulo DI.
Veamos como daga ¡Le permite decorar la diferencia en el proyecto mientras mantiene el proveedor original!
Puede definir un proveedor independiente y el proveedor decorado debe usar anotaciones. @Named
Notas con algunos calificadores de cadena.
Si nunca antes ha usado @Named, puede leerlo aquí.
@Module
abstract class FooModule
@Binds
abstract fun provideFoo(foo: FooDefaultImpl): IFoo
@Module
class FooDecoratorModule
@Provides
@Named(NAMED_KEY)
fun provideFoo(foo: IFoo): IFoo
return FooDecorator(original)
companion object
const val NAMED_KEY = "Foo Decorator"
Luego, si tiene que usar variaciones decorativas en algunas clases, solo necesita agregar @Named(NAMED_KEY)
El calificador de la variable inyectada.
class Bar @Inject constructor(
@Named(NAMED_KEY) private val foo: IFoo
)
//use decorated foo below
Además, podemos agregar o eliminar @Named
Anota para usar diferentes objetos de decoración en diferentes contextos.