优点:一致处理对象以及对象容器。
缺点:使得设计变得更加复杂。
组合模式一般处理树形结构,如下图。
组合模式核心:
- Component(抽象构件):定义叶子和容器的共同点。
- Leaf(叶子构件):无子节点都称为叶子。
- Composite(容器构件):用于存储子节点(叶子)。
模拟一个公司工作的例子。
首先创建一个Component(抽象构件):
/**
* 这是一个Component(抽象构件)
*/
public interface Component {
void work();
}
然后Leaf(叶子构件):
/**
* 这是一个Leaf(叶子构件)
*/
public class Leaf implements Component {
private String name;
public Leaf(String name) {
this.name = name;
}
@Override
public void work() {
Log.d("TAG", name + "在工作");
}
}
然后是Composite(容器构件):
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
/**
* 这是一个Composite容器构件
*/
public class Composite implements Component {
private String name;
private List<Component> list = new ArrayList<>();//用于存储子节点
public Composite(String name) {
this.name = name;
}
//新增方法
public void add(Component c) {
list.add(c);
}
//删除方法
public void remove(Component c) {
list.remove(c);
}
//获取子节点方法
public Component getChild(int index) {
return list.get(index);
}
@Override
public void work() {
Log.d("TAG", name + "在工作");
for (Component component : list) {
component.work();
}
}
}
调用:
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
/**
* 这是调用者
*/
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//添加一家公司,在公司中添加一个部门,在部门中添加人员
Composite company, department;
company = new Composite("***科技有限公司");
department = new Composite("软件部");
Leaf person = new Leaf("张三");
company.add(department);
department.add(person);
company.work();
}
}
结果:已完成测试!有不对的地方欢迎指出,感恩。