设计模式-组合模式

  1. 定义
    允许将对象组合成树形结构来表现"整体/部分"层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
  2. 特点
    组件接口同时具有叶子节点和父节点的属性,具有2种角色。组合模式以单一责任设计原则换取透明性。
  3. 代码实例

    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 菜单组件,同时具有菜单和菜的角色,菜单可以有子菜单
     */
    abstract class MenuComponent {
    
        /* 菜具有的方法 */
        // 获取菜名
        public String getName() {
            throw new UnsupportedOperationException();
        }
    
        // 获取菜价格
        public int getPrice() {
            throw new UnsupportedOperationException();
        }
    
        /* 菜单具有的方法  */
    
        // 向菜单中添加菜或子菜单
        public void add(MenuComponent menuComponent) {
            throw new UnsupportedOperationException();
        }
    
        /* 共有方法 */
        public void print() {
            throw new UnsupportedOperationException();
        }
    }
    
    // 菜
    class MenuItem extends MenuComponent {
        public String name;
        public int price;
    
        public MenuItem(String name, int price) {
            this.name = name;
            this.price = price;
        }
    
        @Override
        public String getName() {
            return name;
        }
    
        @Override
        public int getPrice() {
            return price;
        }
    
        @Override
        public void print() {
            System.out.println("菜名: " + name + ": " + price);
        }
    }
    
    // 菜单
    class Menu extends MenuComponent {
        // 用于存储菜名或子菜单
        public List<MenuComponent> list = new ArrayList<>();
    
        public String menuName;
    
        public Menu(String menuName) {
            this.menuName = menuName;
        }
    
        @Override
        public void add(MenuComponent menuComponent) {
            list.add(menuComponent);
        }
    
        @Override
        public String getName() {
            return menuName;
        }
    
        @Override
        public void print() {
            System.out.println("菜单名: " + menuName);
            list.forEach(MenuComponent::print);
        }
    }
    
    // 客户端演示
    class Client {
        public MenuComponent menuComponent;
    
        public void setMenuComponent(MenuComponent menuComponent) {
            this.menuComponent = menuComponent;
        }
    
        public void print() {
            menuComponent.print();
        }
    
        public static void main(String[] args) {
            Menu menu = new Menu("主菜单");
            menu.add(new MenuItem("可乐", 3));
            menu.add(new MenuItem("炸鸡", 15));
    
            Menu subMenu = new Menu("子菜单");
            subMenu.add(new MenuItem("汉堡", 20));
            subMenu.add(new MenuItem("薯条", 10));
            // 将子菜单加入主菜单
            menu.add(subMenu);
    
            Client client = new Client();
            client.setMenuComponent(menu);
    
            // 递归打印
            client.print();
        }
    }

转载于:https://www.cnblogs.com/bosslv/p/11353736.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值