Java访问者模式扩展特性
本文关键字:扩展 模式 访问者 Java | 更新日期: 2023-09-27 18:16:35
我在研究访问者模式时遇到了这个有用的例子:https://stackoverflow.com/a/2604798/974594。这篇文章很清楚,很容易理解,虽然,我在理解最后一部分有问题,从这里开始:
我不明白他在说什么。我的意思是,如果他现在想要实现"价格"特性,那么必须对现有代码进行哪些更改/添加(基于这种模式方法)?div =话虽如此,访客通常是多余的,他们有一个倾向于使api变得非常复杂,并且可能非常麻烦为每一种新的行为定义一个新的访问者。
通常,应该使用更简单的模式,如继承来代替游客。例如,原则上我可以这样写一个类:
class FruitPricer : IFruitVisitor { public double Price { get; private set; } public void Visit(Orange fruit) { Price = 0.69; } public void Visit(Apple fruit) { Price = 0.89; } public void Visit(Banana fruit) { Price = 1.11; } }
它可以工作,但是比起这种琐碎的修改有什么好处呢?
抽象类Fruit
{ public abstract void Accept(IFruitVisitor visitor); public abstract double Price { get; } }
您引用的答案错过了访问者的许多要点。它说"访问者被用来在不牺牲类型安全的情况下实现类型测试",这是完全错误的。GOF的书中说"访问者可以让你定义一个新的操作,而不需要改变它所操作的元素的类"。当然,访问者可以用于测试对象的类型以外的东西,以及在不涉及测试的对象上执行操作。
"Visitor is overkill"是经常被提及的,但通常是那些试图用Visitor来做它不打算做的事情的人说的,然后发现-惊讶-它并没有真正起作用。
海报是正确的,他们引用的第二段代码是实现功能的一种更简单的方法,但它忽略了一点,即访问者是针对不想修改Fruit类的情况。
为每个子类添加特定于类的价格实现。
关键是有时Visitor
是多余的,功能可以以一种不那么抽象的方式添加。
现在,Fruit
有Price
是否有意义是另一个问题。Item
有一个价格,Item
有一个Fruit
,或者Fruit
成为Item
的子类,或者它们是复合的,或者…