安卓

设计模式-组合模式

2022-01-17  本文已影响0人  Archer_J
/**
 * 组合模式
 * 组合(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;
    }
}
上一篇下一篇

猜你喜欢

热点阅读