组合模式
组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系。
组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
这种类型的设计模式属于结构型模式。
组合模式使得用户对单个对象和组合对象的访问具有一致性, 即 :组合能让客户以一致的方式处理个别对象以及组合对象
组合实体模式(Composite Entity Pattern)用在 EJB 持久化机制中。一个组合实体是一个 EJB 实体 bean,代表了对象的图解。当更新一个组合实体时,内部依赖对象 beans 会自动更新,
因为它们是由 EJB 实体 bean 管理的。以下是组合实体 bean 的参与者。
组合模式解决的问题
1、组合模式解决这样的问题,当我们的要处理的对象可以生成一颗树形结构,而我们要对树上的节点和叶子进行操作时,它能够提供一致的方式,而不用考虑它是节点还是叶子
2、我们业务功能:菜单树
3、商城项目,商品分类(京东,淘宝)
应用实例与代码实现
商城项目,商品分类
京东商城--<数码>,<食品>---<手机,电视,照相机><方面面,辣条>----<苹果,华为,小米><······><······>
代码实现:
定义京东商城抽象类
package com.atxiaodei.composite;
// 京东商城
public abstract class JingDShoppingMall {
private String name; // 名字
private String des; // 说明
protected void add(JingDShoppingMall jidong) {
//默认实现
throw new UnsupportedOperationException();
}
protected void remove(JingDShoppingMall jidong) {
//默认实现
throw new UnsupportedOperationException();
}
//构造器
public JingDShoppingMall(String name, String des) {
super();
this.name = name;
this.des = des;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
//方法print, 做成抽象的, 子类都需要实现
protected abstract void print();
}
京东商城下面的商品类别
package com.atxiaodei.composite;
import java.util.ArrayList;
import java.util.List;
//类别:京东商城下面的商品类别(<数码>,<食品>,<···>)
public class Digitalgoods extends JingDShoppingMall {
// list存放的是商品类别
List<JingDShoppingMall> jingDShoppingMalls=new ArrayList<>();
public Digitalgoods(String name, String des) {
super(name, des);
// TODO Auto-generated constructor stub
}
// 重写add方法,完成实际需求业务(商城商品类别添加)
@Override
protected void add(JingDShoppingMall jidong) {
jingDShoppingMalls.add(jidong);
}
// 重写remove方法,完成实际需求业务(商城商品类别移除)
@Override
protected void remove(JingDShoppingMall jidong) {
jingDShoppingMalls.remove(jidong);
}
@Override
protected void print() {
System.out.println("------------京东商城商品的类别:" + getName() + ",描述:"+ getDes());
//遍历 jingDShoppingMalls
for (JingDShoppingMall jingDShoppingMall : jingDShoppingMalls) {
jingDShoppingMall.print();
}
}
}
商品厂家
package com.atxiaodei.composite;
import java.util.ArrayList;
import java.util.List;
// 商品厂家(数码手机的厂家有:小米,华为,苹果)
public class JingDFactor extends JingDShoppingMall {
List<JingDShoppingMall> jingDShoppingMalls=new ArrayList<JingDShoppingMall>();
public JingDFactor(String name, String des) {
super(name, des);
// TODO Auto-generated constructor stub
}
// 重写add方法,完成实际需求业务(商品厂家类别添加)
@Override
protected void add(JingDShoppingMall jidong) {
jingDShoppingMalls.add(jidong);
}
// 重写remove方法,完成实际需求业务(商品厂家类别移除)
@Override
protected void remove(JingDShoppingMall jidong) {
jingDShoppingMalls.remove(jidong);
}
@Override
protected void print() {
System.out.println("------------京东商城商品的类别的商品厂家:" + getName() + ",描述:"+ getDes());
//遍历 jingDShoppingMalls
for (JingDShoppingMall jingDShoppingMall : jingDShoppingMalls) {
jingDShoppingMall.print();
}
}
}
具体的商品
package com.atxiaodei.composite;
// 具体的商品
public class JingdGoods extends JingDShoppingMall {
// 没有集合
public JingdGoods(String name, String des) {
super(name, des);
// TODO Auto-generated constructor stub
}
//add , remove 就不用写了,因为他是叶子节点
@Override
public String getName() {
// TODO Auto-generated method stub
return super.getName();
}
@Override
public String getDes() {
// TODO Auto-generated method stub
return super.getDes();
}
@Override
protected void print() {
// TODO Auto-generated method stub
System.out.println(getName());
}
}
客户端,测试
package com.atxiaodei.composite;
public class Client {
public static void main(String[] args) {// 模拟一个买手机选类型的场景
// 京东商城 创建商品类别
JingDShoppingMall goodsType=new Digitalgoods("数码", "在京东上面买的数码一般假货比较少");
// 京东商城 商品类别创建厂商
JingDShoppingMall xiaomiFactor= new JingDFactor("小米厂家", "小米手机一般");
JingDShoppingMall huaweiFactor= new JingDFactor("华为厂家", "国产手机,农村人最爱");
JingDShoppingMall pgFactor= new JingDFactor("苹果厂家", "苹果手机,年轻人的热爱");
//创建各个厂商下面的手机商品
//小米
xiaomiFactor.add(new JingdGoods("小米1", "小米1"));
xiaomiFactor.add(new JingdGoods("小米2", "小米2"));
xiaomiFactor.add(new JingdGoods("小米3", "小米3"));
//华为
huaweiFactor.add(new JingdGoods("华为保驰捷1", "华为保驰捷1"));
huaweiFactor.add(new JingdGoods("华为保驰捷2", "华为保驰捷2"));
huaweiFactor.add(new JingdGoods("华为保驰捷3", "华为保驰捷3"));
//苹果
pgFactor.add(new JingdGoods("iphone8", "iphone8"));
pgFactor.add(new JingdGoods("iphone11", "iphone11"));
pgFactor.add(new JingdGoods("iphone12", "iphone12"));
// 将厂商加入商品类别
goodsType.add(xiaomiFactor);
goodsType.add(huaweiFactor);
goodsType.add(pgFactor);
goodsType.print();
}
}
输出
------------京东商城商品的类别:数码,描述:在京东上面买的数码一般假货比较少
------------京东商城商品的类别的商品厂家:小米厂家,描述:小米手机一般
小米1
小米2
小米3
------------京东商城商品的类别的商品厂家:华为厂家,描述:国产手机,农村人最爱
华为保驰捷1
华为保驰捷2
华为保驰捷3
------------京东商城商品的类别的商品厂家:苹果厂家,描述:苹果手机,年轻人的热爱
iphone8
iphone11
iphone12
组合模式在JDK集合的源码分析
public class Composite {
public static void main(String[] args) {
//说明
//1. Map,AbstractMap就是一个抽象的构建 (类似京东商城)
//2. HashMap是一个中间的构建(Composite), 实现/继承了相关方法
// put, putall
//3. Node 是 HashMap的静态内部类,类似Leaf叶子节点, 这里就没有put, putall
// static class Node<K,V> implements Map.Entry<K,V>
Map<Integer,String> hashMap=new HashMap<Integer,String>();
hashMap.put(0, "东游记");//直接存放叶子节点(Node)
Map<Integer,String> map=new HashMap<Integer,String>();
map.put(1, "西游记");
map.put(2, "红楼梦"); //..
hashMap.putAll(map);
System.out.println(hashMap);
}
}
组合模式的注意事项和细节
原文:https://www.cnblogs.com/zhugekongan/p/14773910.html