我想知道是否有办法处理访客模式的简单条件?
例如,如果我们有以下代码,我们如何将访客模式应用于它?
public class Elseif
{
private int total;
public int Condition(int x)
{
if(x==1)
{
total = 100;
}
else if(x==2)
{
total = 200;
}
return total;
}
}
换句话说,您想如何为IVisitor接口编写重载?
public interface IVisitor
{
int Visitor(int x);
}
答案 0 :(得分:3)
也许您正在寻找Chain Of Responsibility模式?
假设您必须计算奖金并使用类似的东西
public double GetBonusRate(int workingDays, int numberOfSales)
{
if(numberOfSales > 20)
{
return 1.5;
}
if(workingDays >= 20 && numberOfSales > 10)
{
return 1.2;
}
if(numberOfSales > 5)
{
return 1.0;
}
if(workingDays > 10)
{
return 0.1;
}
return 0;
}
你希望,这个条件的数量会增加而你会意识到,在错误的地方添加新条件会导致错误。
责任链为您提供了另一种方法。
var chain = new PerfectBonusRate();
chain.RegisterNext(new GoodBonusRate())
.RegisterNext(new StandartBonusRate())
.RegisterNext(new LazyBonusRate())
.RegisterNext(new NoBonusRate());
var bonusRate = chain.GetBonusRate(10, 20);
实施
abstract class ChainElement
{
ChainElement _next;
public ChainElement RegisterNext(ChainElement next)
{
_next = next;
return next;
}
public double GetBonusRate(int workingDays, int numberOfSales)
{
if(IsMatched(workingDays, numberOfSales))
{
return GetBonusValue();
}
return _next.GetBonusRate(workingDays, numberOfSales);
}
protected abstract bool IsMatched(int workingDays, int numberOfSales);
protected abstract int GetBonusValue();
}
class PerfectBonusRate : ChainElement
{
protected override bool IsMatched(int workingDays, int numberOfSales)
{
return numberOfSales > 20;
}
protected override double GetBonusValue()
{
return 1.5;
}
}
class GoodBonusRate : ChainElement
{
protected override bool IsMatched(int workingDays, int numberOfSales)
{
return workingDays >= 20 && numberOfSales > 10;
}
protected override double GetBonusValue()
{
return 1.2;
}
}
//and the same for StandartBonusRate, LazyBonusRate...
class NoBonusRate : ChainElement
{
protected override bool IsMatched(int workingDays, int numberOfSales)
{
return true;
}
protected override double GetBonusValue()
{
return 0.0;
}
}
答案 1 :(得分:1)
访问者模式用于区分不同的类型,特别是如果您有(抽象)超类的对象,并且您希望根据具体执行特殊操作类型。这意味着,您可以(而且应该)使用它而不是使用if-then-else进行强制转换测试。
访客模式不是用于区分值。
答案 2 :(得分:0)
用于解决某些特定问题的模式。访问者模式解决了以下问题 - 在不更改这些对象的情况下向对象的(复合)结构添加新功能。所以,让我重新解释一下你的问题 - 如何在没有对象结构和功能添加的情况下为对象结构添加新功能。这就像用小提琴敲打钉子一样。
记住 - 首先出问题。然后去解决那个问题的模式。反之亦然。
更新,你编码的问题是什么?它不遵循Command-query separation原则。相同方法执行操作(修改总计)并将总计返回给调用者。我将命令和查询分开,以使您的代码更清晰:
public int Total { get; set; }
public void DoSomething(int x)
{
if(x == 1)
{
Total = 100;
return;
}
if(x == 2)
{
Total = 200;
return;
}
}