设计模式之组合模式
一、组合模式是什么?
组合模式是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性。
组合模式是用来描绘树形结构的,树状结构比较常见的比如公司部门,省市地区等都可以使用组合模式描述。
二、组合模式详解
1.组合模式组成
组合模式包含以下主要角色:
- 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。我们一般认为树状结构的每个节点都是一样的,但是也有不一样的情况,这里相当于树状节点的父级,这样来看每个节点就都一样了,一般都有添加、删除、和动作(该树形结构的功能)方法。
- 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于继承或实现抽象构件。这是树状结构最底层那个,没有下级了。
- 树枝构件(Composite)角色 / 中间构件:是组合中的分支节点对象,它有子节点,用于继承和实现抽象构件。除了最底层之外的节点。
2.示例demo
用省市地区发通知举例:
抽象构件(将地区抽象出来):
//这里使用接口或者抽象类都可以的
public abstract class Region {
/**
* 添加节点
* @param region
*/
abstract void add(Region region);
/**
* 删除节点
* @param region
*/
abstract void remove(Region region);
/**
* 获取当前节点下面的节点
* @param i
* @return
*/
abstract Region getChild(int i);
/**
* 通知,上面下个政策一级一级的传递,一般都有一个动作方法
*/
abstract void notice();
}
叶子节点:
//树叶地区
public class LeafRegion extends Region{
private String name;
public LeafRegion(String name) {
this.name = name;
}
@Override
void add(Region region) {
//叶子节点没有下级
}
@Override
void remove(Region region) {
//叶子节点没有下级
}
@Override
Region getChild(int i) {
//叶子节点没有下级
return null;
}
@Override
void notice() {
/**
* 最底层的接到了通知
*/
}
}
树枝节点:
//树枝地区
public class CompositeRegion extends Region{
private String name;
//用来盛放子节点
private List<Region> children = new ArrayList<>();
@Override
void add(Region region) {
children.add(region);
}
@Override
void remove(Region region) {
children.remove(region);
}
@Override
Region getChild(int i) {
return null;
}
@Override
void notice() {
/*通知下级所有的部门,下级如果是树枝的话继续通知,这是个递归操作*/
for (Region child : children) {
child.notice();
}
}
}
客户端使用:
public static void main(String[] args) {
Region shandong = new CompositeRegion("山东");
Region jinan = new CompositeRegion("济南");
Region lixia = new LeafRegion("历下区");
Region gaoxin = new LeafRegion("高新区");
jinan.add(lixia);
jinan.add(gaoxin);
shandong.add(jinan);
//山东发个通知将通知到最底层
shandong.notice();
}
总结
优点
- 节点之间统一方法处理,调用简单,底层直接走的递归实现所有节点都通知到。
- 新增和删除节点比较自由,不受任何限制,完全符合开闭原则。
缺点
- 设计比较复杂,需要梳理节点之间的逻辑关系