23种设计模式之组合模式(composite)


这两天在学习组合模式,看完以后感觉似懂非懂,发现这个设计模式真的很伟大。下面就是详细的介绍了


概念:
       将对象组合成树形结构以表示“部分-整体”的层次结构。使用户对单个对象和组合对象的使用更具有一致性。


适用性:
       想表示对象的部分-整体层次结构。


23种设计模式之组合模式(composite)_第1张图片


结构:
       1.component抽象组件,定义参加组合对象的共有方法和属性,可以定义一些默认的函数或属性。
       2.leaf叶子节点,构成组合树的最小构建单元。
       3.composite树枝节点组件,它的作用是组合树枝节点和叶子节点形成一个树形结构。

      高层模块的调用很简单,一棵树型结构的所有节点都是Component,局部和整体对调用者来说都是一样的,没有区别,所以高层模块不必关心自己处理的是单个对象还是整个组合结构,简化了高层模块的代码。节点自由扩展增加,使用组合模式,如果想增加一个树枝节点或者叶子节点都是很简单的,只要找到它的父节点就可以了,非常容易扩展,符合“开闭原则”。是应用最广的模式之一,应用在维护和展示“部分-整体”关系的场景中,如树形菜单,文件夹等等。

在Android 中的应用:           
         View和ViewGroup的使用。


23种设计模式之组合模式(composite)_第2张图片


代码介绍 : 
        首先在View类种定义了有关的具体操作,然后在ViewGroup类中继承View类,并添加相关的增加、删除和查找孩子View的节点


View类代码如下

public class View implements Callback, android.view.KeyEvent.Callback, AccessibilityEventSource { 
//里面的不必要代码已经省略
}


ViewGroup的代码如下:

public abstract class ViewGroup extends View implements ViewParent, ViewManager {
    //添加
    public void addView(View child) {
        throw new RuntimeException("Stub!");
    }

    public void addView(View child, int index) {
        throw new RuntimeException("Stub!");
    }

    public void addView(View child, int width, int height) {
        throw new RuntimeException("Stub!");
    }

    public void addView(View child, ViewGroup.LayoutParams params) {
        throw new RuntimeException("Stub!");
    }

    public void addView(View child, int index, ViewGroup.LayoutParams params) {
        throw new RuntimeException("Stub!");
    }

    //删除
    public void removeView(View view) {
        throw new RuntimeException("Stub!");
    }

    public void removeViewInLayout(View view) {
        throw new RuntimeException("Stub!");
    }

    public void removeViewsInLayout(int start, int count) {
        throw new RuntimeException("Stub!");
    }

    public void removeViewAt(int index) {
        throw new RuntimeException("Stub!");
    }

    public void removeViews(int start, int count) {
        throw new RuntimeException("Stub!");
    }

   //查找
   public View getChildAt(int index) {
        throw new RuntimeException("Stub!");
    }
}

 
  

具体叶子节点,如Button,它是继承TextView的,TextView是继承View的,代码如下:

public class TextView extends View implements OnPreDrawListener {
//具体操作省略
}

继承ViewGroup类的有我们常用的容器类(包装和容纳各种View),如LinearLayout、FrameLayout等,代码如下:

public class RelativeLayout extends ViewGroup {
//具体代码省略,可以对View进行操作,因为它继承ViewGroup
}







你可能感兴趣的:(23种设计模式)