【发布时间】:2011-12-13 00:07:58
【问题描述】:
我正在尝试掌握 Java 中的访问者方法。
我正在尝试编写一个非常简单的程序来习惯它。基本上它是一个食物菜单。我想读入用户输入(食物类型(开胃菜、主菜……)和食物名称(意大利面、鱼……)),然后将此项目添加到菜单中。
我相当确定到目前为止我的代码是正确的,我只是在努力弄清楚如何传递从用户那里读取的值。
我的一个也是程序员的朋友告诉我,您应该在访问者类中拥有所有功能(或至少尽可能多)。
那么我是否将用户输入创建到菜单元素中?然后让访问者将元素添加到菜单中? (我也希望能够从菜单中删除项目,但我假设这只是逆向工程添加的方法)
或者我没有让访问者实际添加元素。例如;我是否只需创建菜单元素然后传递它,然后在菜单类中添加功能?
对我来说,让访问者实际添加项目是有意义的,因为我想保留特定于添加访问者的功能,但每次我尝试实现时,我都会被告知我必须创建数组列表包含静态菜单元素,我不禁认为我做错了。
我不能 100% 确定访客模式是否适合我正在尝试做的事情?
就我个人而言,我相信我要么真的,真的很接近......要么很远!!
你们能提供的任何帮助都会很棒,即使你们可以向我指出一个很好的教程来帮助解释如何正确使用这种模式。
这是我目前所拥有的:
interface MenuElementVisitor {
void visit(Starter starter);
void visit(MainCourse mainCourse);
void visit(Desert desert);
void visit(Drinks drinks);
void visit(Menu menu);
}
菜单元素类
interface MenuElement {
void accept(MenuElementVisitor visitor); // MenuElements have to provide accept().
}
class Starter implements MenuElement {
private String name;
public Starter(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void accept(MenuElementVisitor visitor) {
visitor.visit(this);
}
}
class MainCourse implements MenuElement {
private String name;
public MainCourse(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void accept(MenuElementVisitor visitor) {
visitor.visit(this);
}
}
class Desert implements MenuElement {
private String name;
public Desert(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void accept(MenuElementVisitor visitor) {
visitor.visit(this);
}
}
class Drinks implements MenuElement {
private String name;
public Drinks(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void accept(MenuElementVisitor visitor) {
visitor.visit(this);
}
}
菜单类
class Menu implements MenuElement {
MenuElement[] elements;
public MenuElement[] getElements() {
return elements.clone(); // Return a copy of the array of references.
}
public Menu() {
this.elements = new MenuElement[] {
new Starter("Soup"),
new Starter("Pate"),
new MainCourse("Steak"),
new MainCourse("Fish"),
new Desert("Ice Cream"),
new Desert("Apple Tart"),
new Drinks("7up"),
new Drinks("Wine"),
};
}
public void accept(MenuElementVisitor visitor) {
for(MenuElement element : this.getElements()) {
element.accept(visitor);
}
visitor.visit(this);
}
}
向菜单添加项目的访问者
class MenuElementAddVisitor implements MenuElementVisitor {
System.out.println("Press 1 for Starter, 2 for Main Course, 3 for Desert or 4 for Drinks");
int MenuElementType = Console.readInt();
System.out.println("Type the name of the Menu Element you want to add");
String MenuElementName = Console.readString();
访问者从菜单中删除项目
class MenuElementRemoveVisitor implements MenuElementVisitor {
}
运行代码演示
public class VisitorDemo {
static public void main(String[] args) {
Menu menu = new Menu();
menu.accept(new MenuElementAddVisitor());
menu.accept(new MenuElementRemoveVisitor());
}
}
【问题讨论】:
-
看起来你的两个访问者类都没有进入。访问方法都没有,第二个是空的。
-
该死!昨晚忘记放了(发帖的时候已经很晚了,我现在把我现在的代码扔进去)
标签: java design-patterns visitor-pattern