组合模式(Composite)
2020-01-11 本文已影响0人
jiahzhon
- 组合模式允许将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
- 组合模式让我们能用树形方式创建对象的结构,树里面包含了组合以及个别的对象。
- 使用组合结构,我们能把相同的操作应用在组合和个别对象上。换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别。
使用场景:
- 在需要表示一个对象整体与部分的层次结构的场合。
- 要求对用户隐藏组合对象与单个对象的不同,用户可以用统一的接口使用组合结构中的所有对象的场合。
角色
- 抽象组件角色(Component):
- 所有组件的抽象
- 声明在组合模式中的对象的接口
- 叶子角色(Leaf):
- 表示组合模式中的叶子对象
- 实现了Component
- 没有子节点
- 组合角色(Composite):
- 表示一个组合组件(拥有叶子节点)
- 实现了Component,
- 拥有子节点,并具备操作Component的方法,增加组件、删除组件等
代码
- Component
public abstract class Component{
//这个是容器类的抽象类,定义好行为,定义创建移除子容器的方法抽象的。
public abstract void addComposite(Component c); //添加成员
public abstract void removeComposite(Component c);//移除成员
public abstract Component getComposite(int i);//获取子容器
public abstract void operation();//业务方法
}
- Leaf
public class Leaf extends Component{
//首先重写component的方法
//叶子节点关键点在于业务
public void Operation(){
System.out.print("业务方法");
}
public void addComponent(Component c){
//提示报错 。
System.out.print("不是子容器");
}
public void removeComponent(Component c){
//提示报错 。
System.out.print("不是子容器");
}
public Component addComponent(int c){
//提示报错 。
System.out.print("不是子容器");
return null;
}
}
- Composite
public class Composite extends Component{
//首先来一个存储的集合
private ArrayList<Component> list = new ArrayList<Component> ;
public void addComponent(Component c){
list.add(c);
}
public void removeComponent(Component c){
list.remove(c);
}
public Component getComponent(int c){
Component c1 =list.get(c);
return c1;
}
public void operation(){
for(Object obj:list){
((Component)obj).operation();
}
}
透明模式和安全模式
上面应用组合模式的方式就是透明方式,接口Company定义了addOrg、removeOrg方法,无论是叶子角色还是树枝角色都拥有addOrg、removeOrg方法,从实际使用的角度来说,叶子角色不需要这两个方法。对于外界来说,叶子和树枝的区别是透明的,这就是透明方式。
安全方式就是接口Company里没有定义addOrg、removeOrg方法,只在树枝角色添加addOrg、removeOrg方法。这样用户需要对叶子角色和树枝角色进行判断能不能使用addOrg、removeOrg方法。
透明方式的缺点是叶子角色在添加叶子或者树枝时是什么也不做,用户觉得应该是操作成功了,但是并没有操作成功。安全方式的缺点就是在添加叶子和树枝的时候需要进行判断。