设计模式-组合模式
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;
}
}