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的嵌套组合。

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

  • 相关阅读:
    《应用Yii1.1和PHP5进行敏捷Web开发》学习笔记(转)
    YII 小模块功能
    Netbeans代码配色主题大搜集
    opensuse 启动巨慢 解决方法 90s多
    opensuse 安装 网易云音乐 rpm netease music
    linux qq rpm deb opensuse
    openSUSE 安装 alien
    第一行代码 Android 第2版
    Android Studio AVD 虚拟机 联网 失败
    docker error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.29/containers/json: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuratio
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/5836608.html
Copyright © 2011-2022 走看看