Agregando funcionalidades a un objeto
Fernando Dodino
Algoritmos 2
Decorator
Template method en un objeto decorado
¿Qué pasa en este ejemplo?
>>class Producto
def double precioVenta() { costo * 2.5 + this.costoAlmacenamiento() }�abstract def double costoAlmacenamiento()
>>class ProductoPropio extends Producto
def double costoAlmacenamiento() { 500 }
... otras subclases...
<<Decorator>>
class ProductoEnPromocion extends Producto {� Producto producto� override precioVenta() { producto.precioVenta() * 0.8 }� override costoAlmacenamiento() { 0 }�}
Producto camperaSindical = new ProductoEnPromocion(new ProductoPropio(60))�// 60 es el costo
Assert.assertEquals(120, camperaSindical.precioVenta)
Template method en un objeto decorado
¿Qué pasa en este ejemplo?
>>class Producto
def double precioVenta() { costo * 2.5 + this.costoAlmacenamiento() }�abstract def double costoAlmacenamiento()
>>class ProductoPropio extends Producto
def double costoAlmacenamiento() { 500 }
... otras subclases...
<<Decorator>>
class ProductoEnPromocion extends Producto {� Producto producto� override precioVenta() { producto.precioVenta() * 0.8 }� override costoAlmacenamiento() { 0 }�}
Producto camperaSindical = new ProductoEnPromocion(new ProductoPropio(60))�// 60 es el costo
Assert.assertEquals(120, camperaSindical.precioVenta)
1
1
1
Template method en un objeto decorado
¿Qué pasa en este ejemplo?
>>class Producto
def double precioVenta() { costo * 2.5 + this.costoAlmacenamiento() }�abstract def double costoAlmacenamiento()
>>class ProductoComun extends Producto
def double costoAlmacenamiento() { 500 }
... otras subclases...
<<Decorator>>
class ProductoEnPromocion extends Producto {� Producto producto� override precioVenta() { producto.precioVenta() * 0.8 }� override costoAlmacenamiento() { 0 }�}
Producto camperaSindical = new ProductoEnPromocion(new ProductoComun(60))�// 60 es el costo
Assert.assertEquals(120, camperaSindical.precioVenta)
1
1
2
2
Explorando otras variantes
Mixins
Mixins en Wollok
Pero vamos a ver un ejemplo en Wollok
mixin SafeShop {
var property montoMaximoSafeShop = 50
method comprar(monto) {
if (monto > montoMaximoSafeShop) {
throw new Exception(message = "...")
}
super(monto)
}
}
Mixins en Wollok: Linearization
class ClienteConSafeShop inherits Cliente mixed with SafeShop {}
class ClienteMixto inherits Cliente mixed with SafeShop, Promocion { }
Delegated methods en Kotlin
class ClienteSafeShop(
val maximo: Int,
val cliente : Cliente) : Cliente by cliente {
override fun comprar(monto: Int) {
if (monto > maximo) throw RuntimeException("No puede comprar por más de " + monto)
cliente.comprar(monto)
}
}