姬長信(Redy)

Java – 用于添加方法的访问者模式


所以我创建了一个简单的液体访客模式.如牛奶,果汁和白酒.

Milk类看起来像这样:

public class Milk implements Visitable{

public float tax=0;

@Override
public int price() {
    return 4;
}

@Override
public void accept(Visitor visitor) {
    visitor.visit(this);
}
}

//同样适用于果汁和酒

然后我们可以让一个看起来像这样的访客来计算税收的工作:

public class TaxVisitor implements Visitor {

double taxPerentLiquor=.18;
double taxPerentMilk=.15;
double taxPerentJuice=.10;


@Override
public void visit(Liquor liquor) {

    int price =liquor.price();
    liquor.setTax((float) (price*taxPerentLiquor));
}

@Override
public void visit(Milk milk) {
    float price =milk.price();
    milk.setTax((float) (price*taxPerentMilk));


}

@Override
public void visit(Juice juice) {

    int price =juice.price();
    juice.setTax((float) (price*taxPerentJuice));

}

}

当我们使用它时,我们会这样做:

Visitor taxVisitor = new TaxVisitor();

    Milk milk = new Milk();
    Juice juice = new Juice();

    milk.accept(taxVisitor);
    juice.accept(taxVisitor);

并且“访客”会为我计算每种液体的税.当我想添加一个新的计算时,我看到了我没有必要修改对象集合的好处.但是当我想添加一种新方法时,我遇到了麻烦.遵循开放式封闭原则,我不应该为牛奶类添加新方法.但让我们想象一下,我想添加功能来了解液体的颜色.所以我想扩展milk对象以获得一个名为“getColor()”的方法,该方法将返回“#FFFFFF”.这似乎我需要一个装饰模式来添加此功能,如果我想遵循SOLID开放封闭原则.有没有办法用访客模式这样做?