设计模式——组合模式

来源:互联网 发布:淘宝产品详情图片制作 编辑:程序博客网 时间:2024/05/19 23:13

个人理解;

1. 组合模式:将对象组合成树形结构以表示“部分—整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。它将对象组织到树结构中,可以用来描述整体与部分的关系。同时它也模糊了简单元素(叶子对象)和复杂元素(容器对象)的概念,使得客户能够像处理简单元素一样来处理复杂元素,从而使客户程序能够与复杂元素的内部结构解耦。

2. 在Android开发中用到组合模式并不很多,组合模式更多的用于界面UI的架构设计上,而这部分让开发者去实现的并不多。组合模式在Android 中应用举例:文件系统:Dir File 等,操作控件:View、ViewGroup等

3. 组合模式有透明模式、安全模式两种,区分在于叶子节点有没有开放add、remove操作

4. 组合模式优点:

  • 可以清楚定义分层次的复杂对象,表示全部或部分层次,让高层忽略层次的差异,方便对整个层次结构进行控制。
  • 高层模块可以一致的使用一个组合结构或其中的单个对象,不必挂心处理的是单个对象还是整个组合结构,简化了高层模块的代码。
  • 增加新的枝干和叶子构件都很方便,无需对现有类进行任何修改,就像增加一个自定义View一样。
  • 将对象之间的关系形成树形结构,便于控制。

5. 组合模式UML图:


6. 示例代码:

Component:

public abstract class Component {    protected String name;    public Component(String name) {        this.name = name;    }    public abstract void add(Component component);    public abstract void remove(Component component);    public abstract void clear();    public abstract Component getComponent(int position);    public abstract void doSomething();}

Composite:

public class Branches extends Component {    private List<Component> components = new ArrayList<>();    public Branches(String name) {        super(name);    }    @Override    public void add(Component component) {        components.add(component);    }    @Override    public void remove(Component component) {        if (components.contains(component)){            components.remove(component);        }    }    @Override    public void clear() {        if (components.size() > 0){            components.clear();        }    }    @Override    public Component getComponent(int position) {        if (components.size() > position){            return components.get(position);        }        return null;    }    @Override    public void doSomething() {        Log.i(name, "----------------" + name + "-----------------");        if (components.size() > 0){            for (Component component : components){                component.doSomething();            }        } else {            Log.i(name, "----------------" + name+ "没有子节点-----------------");        }    }}

Leaf:

public class Leaf extends Component {    public Leaf(String name) {        super(name);    }    @Override    public void add(Component component) {        Log.i(name, "----------------" + name+ "没有子节点-----------------");    }    @Override    public void remove(Component component) {        Log.i(name, "----------------" + name+ "没有子节点-----------------");    }    @Override    public void clear() {        Log.i(name, "----------------" + name+ "没有子节点-----------------");    }    @Override    public Component getComponent(int position) {        Log.i(name, "----------------" + name+ "没有子节点-----------------");        return null;    }    @Override    public void doSomething() {        Log.i("Leaf" ,"----------------Leaf:" + name + "----------------");    }}

客户端调用:

private void factoryGroup(){    Component root = new Branches("根节点——学校");    Component grade1 = new Branches("枝节点——高一年级");    Component grade2 = new Branches("枝节点——高二年级");    Component grade3 = new Branches("枝节点——高三年级");    Component class1 = new Leaf("叶子点——第一班");    Component class2 = new Leaf("叶子点——第二班");    Component class3 = new Leaf("叶子点——第三班");    Log.i("factoryGroup", "****************第一次遍历****************");    root.doSomething();    grade1.add(class1);    grade1.add(class2);    grade1.add(class3);    root.add(grade1);    Log.i("factoryGroup", "****************第二次遍历****************");    root.doSomething();    grade2.add(class1);    grade2.add(class2);    grade2.add(class3);    grade3.add(class1);    grade3.add(class2);    grade3.add(class3);    root.add(grade2);    root.add(grade3);    Log.i("factoryGroup", "****************第三次遍历****************");    root.doSomething();    root.getComponent(1).remove(class3);    root.getComponent(1).remove(class2);    Log.i("factoryGroup", "****************第四次遍历****************");    root.doSomething();    root.getComponent(2).clear();    Log.i("factoryGroup", "****************第五次遍历****************");    root.doSomething();}

调用结果:太多了,略



原创粉丝点击