定义
组合模式,他的宗旨是通过将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示,使得客户对单个对象和组合对象的使用具有一致性,属于结构型设计模式。
组合模式一般用于描述整体与部分的关系,它将对象组织到树形结构中,顶层的节点被称为根节点,根节点下面可以包含树枝节点和叶子节点,树枝节点下面又可以包含树枝节点和叶子节点,结构如下:
使用场景:
- 希望客户端可以忽略组合对象与单个对象的差异
- 对象层次具备整体和部分,呈树形结构
透明组合模式通用写法
透明组合模式是把所有的公共方法都定义在父类中,这样的好处是客户端无需分辨叶子节点和树枝节点,都具有完全一致的接口。
public abstract class Component {
protected String name;
public abstract String operate();
public Component(String name) {
this.name = name;
}
public boolean addChild(Component component){
throw new UnsupportedOperationException();
}
public boolean removeChild(Component component){
throw new UnsupportedOperationException();
}
public Component getChild(int index){
throw new UnsupportedOperationException();
}
}
//树枝节点
public class Composite extends Component{
private List<Component> components = new ArrayList<>();
@Override
public String operate() {
StringBuilder sb = new StringBuilder(this.name);
for (Component component : components) {
sb.append("
");
sb.append(component.operate());
}
return sb.toString();
}
public Composite(String name) {
super(name);
}
@Override
public boolean addChild(Component component) {
return components.add(component);
}
@Override
public boolean removeChild(Component component) {
return components.remove(component);
}
@Override
public Component getChild(int index) {
return components.get(index);
}
}
//叶子节点
public class Leaf extends Component{
public Leaf(String name){
super(name);
}
@Override
public String operate() {
return this.name;
}
}
测试:
public class Test {
public static void main(String[] args) {
Component a = new Composite("A");
Component b = new Composite("B");
Component c = new Composite("C");
Component d = new Leaf("D");
Component e = new Leaf("E");
a.addChild(b);
a.addChild(d);
b.addChild(c);
c.addChild(e);
String operate = a.operate();
System.out.println(operate);
}
}
uml类图
安全组合模式写法
安全组合模式之规定系统各个层次的最基础的一致行为,而把组合(节点)本身的方法放到自身中,可以避免叶子节点引入冗余方法。
需要修改父类
public abstract class Component {
protected String name;
public abstract String operate();
public Component(String name) {
this.name = name;
}
}