美文网首页
组合模式(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