我試圖去掌握Java中的訪問者方法。試圖實現訪問者模式
我想寫一個非常簡單的程序來適應它。基本上它是一個食物菜單。我想讀取用戶輸入(食物類型(起動器,主菜...)和食物(麪食,魚...)的名稱),然後將此項目添加到菜單中。
我相當肯定我到目前爲止的代碼是正確的,我只是努力弄清楚如何傳遞從用戶讀取的值。
我的一位同時也是程序員的朋友告訴我,你應該在訪問者類中(或者至少儘可能)擁有所有的功能。
那麼,我需要用戶輸入並將其創建爲菜單元素?然後讓訪問者將該元素添加到菜單中? (我也希望能夠從菜單中刪除項目,但我假設這只是逆向工程的方法來添加)
或者我不會讓訪問者實際添加元素。例如;我是否會創建菜單元素,然後傳遞它,然後在Menu類中添加功能?
對我來說,讓訪問者真正添加項目是有意義的,因爲它是我想保持特定於添加訪問者的功能,但是每次我嘗試實現時,都會被告知我必須使包含菜單元素靜態的arraylist,我不禁想到我做錯了。
我不是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);
}
}
Menu類
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());
}
}
看起來既訪問者類並沒有使其在。無論有訪問方法和第二個是空的 –
該死的!我忘了在昨天晚上(我發佈帖子的時候很晚了,我現在要扔掉我現在的代碼) – Ian