zoukankan      html  css  js  c++  java
  • 设计模式 -- 组合模式 (Composite Pattern)

       定义

      对象组合成部分整体结构,单个对象和组合对象具有一致性。

       看了下大概结构就是集团总公司和子公司那种层级结构。

      实现树状嵌套结构。

      角色介绍:

      Component :抽象根节点:其实相当去总公司,抽象子类共有的方法;

      Composite :相当于总公司的智能部门,也分管子公司,通过集合存储子节点对象,提供增删获取子节点对象的方法;

      leaf:子节点,相当于集团子公司,总公司具有的智能,子公司也具有,因此子节点具有总节点拥有的所有抽象方法以及提供给子类的方法。

      Client:通过抽象跟节点操作子节点的对象。

    public abstract class Component {
       protected String name;
    
       public Component(String name) {
          this.name = name;
       }
    
       public abstract void doSomething();
    }
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 具体枝干节点
     * Created by Administrator on 2016/9/3.
     */
    public class Composite extends Component {
        private List<Component> components = new ArrayList<>();
    
        public Composite(String name) {
            super(name);
        }
    
        //新增子公司
        public void addChild(Component component) {
            components.add(component);
        }
    
        //撤除子公司
        public void remove(Component component) {
            components.remove(component);
        }
    
        //获取某个子公司对象信息
        public void getChild(int index) {
            components.get(index);
        }
    
        @Override
        public void doSomething() {
            System.out.println(name);
            for (int i = 0; i < components.size(); i++) {
                components.get(i).doSomething();
            }
        }
    }
    public class Leaf extends Component {
        public Leaf(String name) {
            super(name);
        }
    
        //相当于输出子公司名称
        @Override
        public void doSomething() {
        System.out.println(name);
        }
    }

    运行结果:

    public class Test {
    
        public static void main(String[] args) {
            Composite composite = new Composite("composite");
    
            Composite composite1 = new Composite("composite1");
            Composite composite2 = new Composite("composite1");
    
            Leaf leaf = new Leaf("leaf1");
            Leaf leaf2 = new Leaf("leaf2");
            composite1.addChild(leaf);
            composite2.addChild(leaf2);
    
            composite.addChild(composite1);
            composite.addChild(composite2);
    
            composite.doSomething();
        }
    }

     实际项目中的使用:

    1. 比如对sd卡文件和文件夹的操作上其实就可以使用该设计模式:
    2. 定义一个抽象类表示文件和文件夹,包含对文件增加,删除,遍历的抽象方法;
    3. 文件夹类继承自1中的抽象类,并实现抽象类中的抽象方法;
    4. 文件类继承自1中的抽象类,并实现抽象类中的抽象方法;

     android源码里面使用到组合模式就是View和ViewGroup的嵌套组合。

    还是很粗糙,以后使用过程中慢慢体会吧

  • 相关阅读:
    深拷贝与浅拷贝
    ifconfig命令不可用
    多边形裁剪问题
    ps aux命令后的内容
    STL sort的危险之处
    jdk与jre的区别
    #与##的用法
    投影选择的一般原则
    关于函数中内存操作
    js生成新加坡的NRIC号码
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/5836608.html
Copyright © 2011-2022 走看看