美文网首页
组合模式(Composite)

组合模式(Composite)

作者: jiahzhon | 来源:发表于2020-01-11 17:30 被阅读0次
  • 组合模式允许将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
  • 组合模式让我们能用树形方式创建对象的结构,树里面包含了组合以及个别的对象。
  • 使用组合结构,我们能把相同的操作应用在组合和个别对象上。换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别。

使用场景:

  • 在需要表示一个对象整体与部分的层次结构的场合。
  • 要求对用户隐藏组合对象与单个对象的不同,用户可以用统一的接口使用组合结构中的所有对象的场合。

角色

  • 抽象组件角色(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方法。

透明方式的缺点是叶子角色在添加叶子或者树枝时是什么也不做,用户觉得应该是操作成功了,但是并没有操作成功。安全方式的缺点就是在添加叶子和树枝的时候需要进行判断。

相关文章

网友评论

      本文标题:组合模式(Composite)

      本文链接:https://www.haomeiwen.com/subject/gvqbactx.html