嗨我正在使用複合模式。我將使用Head First Design Pattern的這個例子來解釋https://github.com/bethrobson/Head-First-Design-Patterns/tree/master/src/headfirst/designpatterns/composite/menuiterator如何自動填充複合模式,多態?
想象一下,每個菜單和子菜單都有一個Id來標識,它的長度是10。 像這樣
0100000000 menu_1
0101000000 menu_1's subMenu_1
0102000000 menu_1's subMenu_2
0102010000 subMenu_2's subMenu_3
0200000000 menu_2
而且我隨意什麼是菜單項,但它有一個ID,這是它所屬的菜單ID其中。例如
0101000000 menuItem_1
0200000000 menuItem_2
所以菜單項1屬於菜單1的子菜單1和菜單項2屬於菜單2.
這將是編碼這樣的。
menu_1.add(subMenu_1);
subMenu_1.add(menuItem_1);
menu_2.add(menuItem_2);
現在我該如何填充菜單?
我在做什麼,因爲我只得到MenuItems,是我削減Id來確定它屬於哪裏。 例如你可以看到有兩個菜單,菜單1(0100000000)和菜單2(0200000000),所以我必須剪掉前2個字符串。
我編碼是這樣的:
class AllMenus implements MenuComponent {
MenuComponent menu_1
MenuComponent subMenu_1
MenuComponent subMenu_2
MenuComponent subMenu_3
MenuComponent menu_2
@Override
add(MenuComponent menu) {
if(menu instanceof Menu) {
super.add(menu)
} else if(menu instanceof MenuItem) {
String subId = menuItem.getId().subString(0,2)
if(subId.equals("01")) {
if(menu_1 == null) {
menu_1 = new Menu();
add(menu_1);
}
subId = menuItem.getId().subString(0,4);
if(subId.equals("0101")) {
if(subMenu_1 == null) {
subMenu_1 = new Menu();
menu_1.add(subMenu_1);
}
subMenu_1.add(menuItem);
} else if(subId.equals("0102")) {
if(subMenu_2 == null) {
subMenu_2 = new Menu();
menu_1.add(subMenu_2);
}
subId = menuItem.getId().subString(0,6);
if(subId.equals("010201")) {
if(subMenu_3 == null) {
subMenu_3 = new Menu();
subMenu_2.add(subMenu_3);
}
subMenu_3.add(menuItem);
}
}
} else if(subId.equals("02") {
if(menu_2 == null) {
menu_2 = new Menu();
add(menu_2);
}
menu_2.add(menuItem);
}
}
}
}
這是每一個菜單項我得到。所以你可以看到這個代碼只需要四個菜單,想象成千上萬的菜單,它怎麼會變得更好? 我已經讀過,我應該使用多態性重複的東西,但我不知道在這種情況下。
如果你給出以大寫字母開頭的變量名稱,它真的讓Java人感到困惑。 'NamesStartingWithAcital'保留給類名稱。建議你解決這個問題;如果我們可以在不使頭痛的情況下查看代碼,那麼您更有可能得到答案。 – slim
你還可以更詳細地解釋十位數字應該如何解釋?我相信我沒有看到這種模式。 – slim
@slim嗨模式是當我使用add()方法。在後面有一個迭代器,否則,MenuItem和Menu實現MenuComponent,十位數字是menuItem所屬的地方。什麼是常量菜單,但不是菜單項,但要確定屬於即時通訊使用subString來確定它必須去menuItem添加到一些menu.edited變量名稱的方式 – MarioK17