目的:
复合实体模式用于对一组相关联的持久化对象进行建模、描述和管理,用于取代对这组对象描述为单独粒度的实体。
程序示例:
对于一个控制台对象,需要管理许多接口功能。通过使用复合实体模式,将消息对象、信号对象等依赖性对象组合在一起,直接使用单个对象对其进行控制。
1.创建抽象从属对象类和粗粒度抽象类
public abstract class DependentObject<T>{
T data;
public void setData(T data) {
this.data = data;
}
public T getData() {
return data;
}
}
public abstract class CoarseGrainedObject<T>{
DependentObject<T>[] dependentObject;
public void setData(T... data) {
IntStream.range(0,data.length).forEach(i->dependentObject[i].setData(data[i]));
}
public T[] getData() {
return (T[]) Arrays.stream(dependentObject).map(DependentObject::getData).toArray();
}
}
2.创建从属类和复合实体类
public class SignalDependentObject extends DependentObject<String>{
}
public class MessageDependentObject extends DependentObject<String>{
}
//操作从属类
public class ConsoleCoarseGrainedObject extends CoarseGrainedObject<String>{
@Override
public String[] getData() {
super.getData();
return new String[]{
dependentObject[0].getData(),dependentObject[1].getData()
};
}
public void init(){
dependentObject=new DependentObject[]{
new MessageDependentObject(),new SignalDependentObject()
};
}
}
//复合实体类
public class CompositeEntity {
private final ConsoleCoarseGrainedObject console = new ConsoleCoarseGrainedObject();
public void setData(String message, String signal) {
console.setData(message, signal);
}
public String[] getData() {
return console.getData();
}
public void init() {
console.init();
}
}
测试
CompositeEntity entity = new CompositeEntity();
entity.init();
entity.setDate("NO Danger","Green Light");
Arrays.stream(entity.getDate()).forEach(System.out::println);
entity.setDate("Danger","Red Light");
Arrays.stream(entity.getDate()).forEach(System.out::println);
/*
NO Danger
Green Light
Danger
Red Light
*/
类图: