Android 设计模式 - 组合模式

1. 定义

组合模式,又叫部分总体模式,用于把一组类似的对象看成一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及总体层次。编程

2. 做用

组合模式使得用户对单个对象和组合对象的使用具备一致性。它模糊了简单元素和复杂元素的概念,客户程序能够像处理简单元素同样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。bash

3. 结构

  • 抽象构建角色:ide

    对象声明接口,在适当的状况下,实现全部类共有接口的默认行为。声明一个接口用于访问和管理它的子部件。测试

  • 树叶构建角色:this

    在组合树中表示叶节点对象,叶节点没有子节点。spa

  • 树枝构建角色:设计

    容器对象,定义有枝节点行为,用来存储子部件,在接口中实现与子部件有关的操做,例如增长(add)和删除(remove)等。code

4. 实现

Android 里面的视图都是 View 的子类,包括 ViewGroup 和 View,咱们就模仿它来实现组合模式。orm

类图

  1. 定义抽象构建角色,也就是 View 接口,它有宽和高两个属性。
public abstract class View {
    protected int width;
    protected int height;

    public View(int width, int height){
        this.width = width;
        this.height = height;
    }

    public abstract void display();
}

复制代码
  1. 定义树枝构建角色,在这里是指 View 容器,负责添加、移除和展现子 View。
public class ViewGroup extends View {
    private List<View> viewList;

    public ViewGroup(int width, int height) {
        super(width, height);
        viewList = new ArrayList<>();
    }

    @Override
    public void display() {
        System.out.println("我是容器,宽:" + width + ",高:" + height + ",里面有" + viewList.size() + "个子视图");
        for (View view : viewList) {
            view.display();
        }
    }

    public void addView(View view) {
        viewList.add(view);
    }

    public void removeView(View view) {
        viewList.remove(view);
    }
}

复制代码
  1. 定义树叶构建角色,显示内容的 View,好比按钮、文本框等。
public class Button extends View {

    public Button(int width, int height) {
        super(width, height);
    }

    @Override
    public void display() {
        System.out.println("我是按钮,宽:" + width + ",高:" + height);
    }
}

public class TextView extends View {

    public TextView(int width, int height) {
        super(width, height);
    }

    @Override
    public void display() {
        System.out.println("我是文本框,宽:" + width + ",高:" + height);
    }
}

复制代码
  1. 测试,把 View 添加到容器中并展现。
public static void main(String args[]) {
        Button button = new Button(100, 200);
        TextView textView = new TextView(200, 200);
        ViewGroup viewGroup = new ViewGroup(300, 300);
        viewGroup.addView(button);
        viewGroup.addView(textView);
        viewGroup.display();
    }

复制代码

5. 优缺点

1. 优势 能够清楚地定义分层次的复杂对象,表示对象的所有或部分层次,增长新构件更容易;客户端调用简单,能够一致地使用组合结构或其中单个对象。cdn

2. 缺点 使设计变得更加抽象,若是对象的业务规则很复杂,则实现组合模式具备很大挑战性,并且不是全部的方法都与叶子对象子类都有关联。

3. 使用场景 须要表示一个对象总体或部分层次,忽略总体与部分的差别,能够一致地对待它们;客户端能够针对抽象构件编程,无须关心对象层次结构的细节。

相关文章
相关标签/搜索