El patrón de diseño de visitante es una forma de separar un algoritmo de una estructura de objeto en la que opera. Esa es la definición oficial de eso. Estoy intentando descubrir cómo esto no rompe la encapsulación. Si digo, por ejemplo, tengo diferentes tipos de clases para diferentes tipos de cuentas bancarias [Ahorro/Fijo/Actual] implementando clase abstracta Cuenta, ¿debo poner el método de interés de cálculo como un método abstracto en la clase de Cuenta abstracta o envío la cuenta? escriba a la implementación del Visitante y calcúlelo allí?Patrón de visitante y encapsulado
Método 1: ¿Debería la implementación del visitante ser responsable de calcular el interés para los diferentes tipos de cuenta?
public interface IInterestVisitor
{
void GetInterest(Savings AccountType);
void GetInterest(Fixed AccountType);
void GetInterest(Current AccountType);
}
Método 2: O deberían ejecutores de la clase Cuenta hacerlo?
public abstract class Account
{
public abstract void AcceptCalculateInterestVisitor(IInterestVisitor iv);
public abstract int CalculateInterestAmount();
}
Si utilizo el método 1, que es la implementación de visitantes que implementa IInterestVisitor que el anterior, entonces el trabajo de cálculo de interés será delegada a la clase de visitantes. Con este enfoque, si agrego otro tipo de cuenta, tendré que modificar la implementación del visitante cada vez que aparezca una nueva cuenta.
Sin embargo, si dejo el bit de cálculo de intereses a las implementaciones de clases de Cuenta abstractas como en el método 2, entonces en mi opinión [corrija si estoy equivocado aquí] No estoy rompiendo el encapsulamiento. Además hay menos código para modificar como todo lo que hago es añadir una nueva clase y tienen el visitante implementar una interfaz como la de abajo
public interface IInterestVisitor
{
void GetInterest(Account AccountType);
}
public class InterestVisitor : IInterestVisitor
{
public void GetInterest(Account AccountType)
{
int i = AccountType.CalculateInterestAmount();
Console.WriteLine(i);
}
}
Como se puede ver, no hay modificación necesaria para la clase interés de los visitantes utilizando el método 2. ¿El método 1 rompe la encapsulación? ¿Se puede llamar al método 2 como patrón de visitante?
Gracias por leer ...
Gracias. Comprendí a partir de la definición de visitantes que el patrón del visitante se usa para cambiar el estado del objeto utilizando las Propiedades/Métodos/Campos del objeto en cuestión. Me está costando averiguar por qué no se realizarán tales cambios, que la clase original los proporcione; sin tener que agregar un visitante para hacerlo. Me parece que un visitante fue agregado como un pensamiento posterior para hacer más en esa clase de una manera que no rompa el código existente que ya está trabajando en esa clase. ¿Qué piensas? :) – user20358
El visitante básicamente trabaja en un objeto mediante el uso de artefactos proporcionados por el objeto o su agregación. Si necesita equilibrar 0 y deshabilitar la tarjeta de crédito, puede definir en el objeto las funciones BalanceToZero() y DisableCreditCard() y en el visitante puede llamarlas en secuencia. Enfoque NO VISITANTE BÁSICAMENTE, se declararía una tercera función en el objeto Función ZeroBalanceAndDisableCard() donde se invocan ambas funciones. Por cierto, el concepto de patrones de diseño a menudo es "borroso", por lo que generalmente necesito "refactorizarlos" según mis necesidades. – Tigran
Aunque el visitante puede cambiar el estado del objeto, ya que tiene el objeto, una recomendación general es no cambiar el estado del objeto. La funcionalidad como mostrar informe en pantalla, imprimir el recibo, leer el informe por voz es un buen ejemplo. –