组合模式---构建清晰的结构

        声明:文章内容根据大牛博客的内容,自己理解后,给自己做的学习笔记,文末会附上大牛博客地址链接。有需要沟通交流的可加我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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值