美文网首页安卓
设计模式-组合模式

设计模式-组合模式

作者: Archer_J | 来源:发表于2022-01-17 14:52 被阅读0次
    /**
     * 组合模式
     * 组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,
     * 它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式。
     * <p>
     * 组合模式一般用来描述整体与部分的关系,它将对象组织到树形结构中,顶层的节点被称为根节点,根节点下面可以包含树枝节点和叶子节点,树枝节点下面又可以包含树枝节点和叶子节点。
     * <p>
     * 在组合模式中,整个树形结构中的对象都属于同一种类型,带来的好处就是用户不需要辨别是树枝节点还是叶子节点,可以直接进行操作,给用户的使用带来极大的便利。
     * <p>
     * 优点
     * 1.组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
     * 2.更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;
     * <p>
     * 缺点
     * 1.设计较复杂,客户端需要花更多时间理清类之间的层次关系;
     * 2.不容易限制容器中的构件;
     * 3.不容易用继承的方法来增加构件的新功能;
     * <p>
     * android中应用:View的结构、文件系统
     */
    public class CompositeTest {
    
        public static void main(String[] args) {
            ICategory cart = new Category("购物车");
            // Goods 为叶子结点
            cart.addGoods(new Goods("眼镜", 1000));
    
            // Category 为树枝节点
            ICategory clothing = new Category("服装");
            clothing.addGoods(new Goods("衣服", 100));
            clothing.addGoods(new Goods("裤子", 200));
            clothing.addGoods(new Goods("鞋子", 800));
            cart.addGoods(clothing);
    
            ICategory electrical = new Category("电器");
            electrical.addGoods(new Goods("手机", 5000));
            electrical.addGoods(new Goods("手表", 2000));
            cart.addGoods(electrical);
    
            // 购物车:(眼镜,服装:(衣服,裤子,鞋子),电器:(手机,手表))
            System.out.println(cart.getDes());
            // 总价格:9100
            System.out.println("总价格:" + cart.getPrice());
        }
    }
    
    /**
     * 商品
     */
    public interface IGoods {
    
        int getPrice();
    
        String getDes();
    }
    
    /**
     * 商品类别
     */
    public interface ICategory extends IGoods {
    
        /**
         * 添加商品
         */
        void addGoods(IGoods goods);
    
        /**
         * 移除商品
         */
        void removeGoods(IGoods goods);
    
        /**
         * 获取商品
         */
        IGoods getGoods(int index);
    }
    
    /**
     * 商品类别实现
     */
    public class Category implements ICategory {
    
        // 该分类下的商品
        private final List<IGoods> clothingList = new ArrayList<>();
        // 分类名称
        private final String categoryName;
    
        public Category(String categoryName) {
            this.categoryName = categoryName;
        }
    
        @Override
        public void addGoods(IGoods goods) {
            clothingList.add(goods);
        }
    
        @Override
        public void removeGoods(IGoods goods) {
            clothingList.remove(goods);
        }
    
        @Override
        public IGoods getGoods(int index) {
            return clothingList.get(index);
        }
    
        @Override
        public int getPrice() {
            int price = 0;
            for (IGoods goods : clothingList) {
                price = price + goods.getPrice();
            }
            return price;
        }
    
        @Override
        public String getDes() {
            StringBuilder des = new StringBuilder(categoryName + ":(");
            for (IGoods goods : clothingList) {
                des.append(goods.getDes()).append(",");
            }
            if (!clothingList.isEmpty()) {
                des.deleteCharAt(des.length() - 1);
            }
            des.append(")");
            return des.toString();
        }
    }
    
    /**
     * 具体商品
     */
    public class Goods implements IGoods {
    
        private final String name;
        private final int price;
    
        public Goods(String name, int price) {
            this.name = name;
            this.price = price;
        }
    
        @Override
        public int getPrice() {
            return price;
        }
    
        @Override
        public String getDes() {
            return name;
        }
    }
    

    相关文章

      网友评论

        本文标题:设计模式-组合模式

        本文链接:https://www.haomeiwen.com/subject/ukpchrtx.html