访问者设计模式是一种将算法与其所操作的对象结构分离的方法。那是它的官方定义。我试图弄清楚这不会破坏封装。例如,如果说我对于实现抽象类Account的不同类型的银行账户[保存/固定/当前]具有不同类型的类,那么我应该将计算利息方法作为抽象方法放在抽象Account类中还是发送该账户输入到Visitor实现并在那里计算?
方法1:访客实现是否应负责计算不同帐户类型的利息?
public interface IInterestVisitor
{
void GetInterest(Savings AccountType);
void GetInterest(Fixed AccountType);
void GetInterest(Current AccountType);
}
方法2:还是Account类的实现者应该这样做?
public abstract class Account
{
public abstract void AcceptCalculateInterestVisitor(IInterestVisitor iv);
public abstract int CalculateInterestAmount();
}
如果我使用方法1,它是如上所述实现IInterestVisitor的访客实现,则计算兴趣的工作将委派给访客类。使用这种方法,如果我添加其他帐户类型,则每次有新帐户出现时,我都需要修改访问者实现。
但是,如果我将利息计算位留给方法2中的上述抽象Account类实现,那么我认为[如果在这里错了,请纠正我]我不会破坏封装。此外,修改代码更少,因为我要做的就是添加一个新类,并让访问者实现一个类似于下面的接口(interface)
public interface IInterestVisitor
{
void GetInterest(Account AccountType);
}
public class InterestVisitor : IInterestVisitor
{
public void GetInterest(Account AccountType)
{
int i = AccountType.CalculateInterestAmount();
Console.WriteLine(i);
}
}
如您所见,使用方法2不需要对兴趣访问者类进行任何修改。方法1是否破坏封装?方法2仍可以称为访客模式吗?
谢谢阅读...
最佳答案
在提供的代码中,我没有看到您需要更改对象以满足您的需求,Visitor
基本上是通过使用对象本身提供的Properties
/Methods
/Fields
更改对象状态。
因此,对我来说,您的代码可以适合于Visitor模式,如果这确实是一个问题,也会导致模式只是指导而非严格的规则。
我个人会选择第二种方式,因为它更加清晰和面向对象。
问候。
关于c# - 访客模式和封装,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7059502/