访问者设计模式是一种将算法与其所操作的对象结构分离的方法。那是它的官方定义。我试图弄清楚这不会破坏封装。例如,如果说我对于实现抽象类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/

10-10 10:52