Public Module PatronEstrategiaDemo
Dim emp As New Empleado()
Console.WriteLine("{0,12}: {1:C}", "Sueldo Anual", emp.SueldoAnual)
Console.WriteLine("{0,12}: {1:C}", "Impuesto", emp.ImporteImpuesto)
Console.WriteLine("{0,12}: {1:C}", "Isr", emp.Isr)
Console.WriteLine("{0,12}: {1:C}", "Escala", emp.Escala)
Private _sueldoAnual As Decimal
Private _impuesto As Impuesto
Public Property SueldoAnual As Decimal
Throw New ArgumentOutOfRangeException("value","El sueldo anual no puede ser un número negativo")
Private Sub SetImpuesto()
_impuesto = Impuesto.ObtenerPara(Me)
Public ReadOnly Property ImporteImpuesto As Decimal
Public ReadOnly Property Isr As Decimal
Public ReadOnly Property Escala As String
Friend MustInherit Class Impuesto
Public Shared ReadOnly MinimoPrimeraEscala As Decimal = 409281
Public Shared ReadOnly MinimoSegundaEscala As Decimal = 613921
Public Shared ReadOnly MinimoTerceraEscala As Decimal = 852667
Protected ReadOnly Empleado As Empleado
Protected Sub New(emp As Empleado)
Public MustOverride ReadOnly Property Importe As Decimal
Public MustOverride ReadOnly Property Isr As Decimal
Public MustOverride ReadOnly Property Escala As String
Public Shared Function ObtenerPara(emp As Empleado) As Impuesto
Throw New ArgumentNullException("emp","El valor no puede ser nulo")
Select Case emp.SueldoAnual
Case Is <= MinimoPrimeraEscala
Return New NoAplicaImpuesto(emp)
Case Is <= MinimoSegundaEscala
Return New PrimeraEscalaImpuesto(emp)
Case Is <= MinimoTerceraEscala
Return New SegundaEscalaImpuesto(emp)
Return New TerceraEscalaImpuesto(emp)
Friend NotInheritable Class PrimeraEscalaImpuesto
Friend Sub New(emp As Empleado)
Public Overrides ReadOnly Property Isr As Decimal
Public Overrides ReadOnly Property Importe As Decimal
Return (Empleado.SueldoAnual - MinimoPrimeraEscala) * 0.15D
Public Overrides ReadOnly Property Escala As String
Friend NotInheritable Class SegundaEscalaImpuesto
Friend Sub New(emp As Empleado)
Public Overrides ReadOnly Property Isr As Decimal
Return (Importe + 30696) / 12
Public Overrides ReadOnly Property Importe As Decimal
Return (Empleado.SueldoAnual - MinimoSegundaEscala) * 0.2D
Public Overrides ReadOnly Property Escala As String
Friend NotInheritable Class TerceraEscalaImpuesto
Friend Sub New(emp As Empleado)
Public Overrides ReadOnly Property Isr As Decimal
Return (Importe + 78466) / 12
Public Overrides ReadOnly Property Importe As Decimal
Return (Empleado.SueldoAnual - MinimoTerceraEscala) * 0.25D
Public Overrides ReadOnly Property Escala As String
Friend NotInheritable Class NoAplicaImpuesto
Friend Sub New(emp As Empleado)
Public Overrides ReadOnly Property Isr As Decimal
Public Overrides ReadOnly Property Importe As Decimal
Public Overrides ReadOnly Property Escala As String