声明:文章内容根据大牛博客的内容,自己理解后,给自己做的学习笔记,文末会附上大牛博客地址链接。有需要沟通交流的可加我QQ群:425120333
因为网络的发达,人们都习惯于在网络上获取自己想要的信息,为了方便人们对信息的查找,基本上各个网站都是有搜索功能的;
但是,仅仅搜索还是不够的,还要有分类菜单,这样一来才真正满足了人们对信息的快速定位查找,从中获取自己想要的信息。
每个菜单下面可能还包含其他菜单。并且删除某个上级菜单时,要将该菜单下的子菜单都同步删除。
菜单接口类:
import java.util.List;
public interface IMenu {
String getName();
void delete();
void delete(String name);
void add(IMenu menu);
List<IMenu> getList();
}
主菜单类:
import java.util.ArrayList;
import java.util.List;
public class MainMenu implements IMenu {
private String name;
private MainMenu mainMenu;
private List<IMenu> list;
public MainMenu(String name) {
this(name, null);
}
public MainMenu(String name, MainMenu mainMenu) {
super();
this.name = name;
this.mainMenu = mainMenu;
list = new ArrayList<IMenu>();
}
@Override
public String getName() {
return this.name;
}
@Override
public void delete() {
List<IMenu> copy = new ArrayList<IMenu>(list);
for (IMenu iMenu : copy) {
iMenu.delete();
}
System.out.println("-----子菜单删除完----------");
if (mainMenu != null) {
mainMenu.delete(this.name);
}
System.out.println("-----------菜单" + name + "删除成功---------");
}
@Override
public void delete(String name) {
for (IMenu imenu : list) {
if (imenu.getName().equals(name)) {
list.remove(imenu);
break;
}
}
}
@Override
public void add(IMenu menu) {
list.add(menu);
}
@Override
public List<IMenu> getList() {
// TODO Auto-generated method stub
return list;
}
}
子菜单类
import java.util.List;
public class SubMenu implements IMenu {
private String name;
private MainMenu mainMenu;
public SubMenu(String name, MainMenu mainMenu) {
super();
this.name = name;
this.mainMenu = mainMenu;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return name;
}
@Override
public void delete() {
mainMenu.delete(name);
}
@Deprecated
@Override
public void delete(String name) {
// TODO Auto-generated method stub
}
@Deprecated
@Override
public void add(IMenu menu) {
// TODO Auto-generated method stub
}
@Deprecated
@Override
public List<IMenu> getList() {
// TODO Auto-generated method stub
return null;
}
}
测试类
import java.util.List;
public class Test {
public static void main(String[] args) {
MainMenu root = new MainMenu("所有分类");
MainMenu fruit = new MainMenu("水果", root);
MainMenu vegetable = new MainMenu("蔬菜", root);
MainMenu other = new MainMenu("其他", root);
root.add(fruit);
root.add(vegetable);
root.add(other);
SubMenu banana = new SubMenu("香蕉", fruit);
SubMenu apple = new SubMenu("苹果", fruit);
SubMenu pair = new SubMenu("梨", fruit);
fruit.add(banana);
fruit.add(apple);
fruit.add(pair);
SubMenu potatoes = new SubMenu("土豆", vegetable);
SubMenu tomatoes = new SubMenu("西红柿", vegetable);
vegetable.add(potatoes);
vegetable.add(tomatoes);
display(null, root);
System.out.println();
System.out.println("----------------分割线--------------");
System.out.println();
fruit.delete();
tomatoes.delete();
display(null, root);
}
public static void display(String prefix, IMenu menu) {
if (prefix == null) {
prefix = "";
}
System.out.println(prefix + menu.getName());
if (menu instanceof MainMenu) {
List<IMenu> list = menu.getList();
for (IMenu iMenu : list) {
display(prefix + "---", iMenu);
}
}
}
}
控制台展示:
所有分类
—水果
——香蕉
——苹果
——梨
—蔬菜
——土豆
——西红柿
—其他
—————-分割线————–
—–子菜单删除完———-
———–菜单水果删除成功———
所有分类
—蔬菜
——土豆
—其他
从结果中可以看出已经达到了预期的效果,这就是使用了组合模式,通过公共的规范接口对菜单进行统一规范,只是在不同类型的菜单操作上,同样的方法名,有不同的行为。
组合模式的应用时维护和展示部分-整体关系的场景,还包括文件和文件夹管理,部门和公司管理等。
参考大牛博客:http://www.cnblogs.com/zuoxiaolong/p/pattern20.html