優點:一致處理對象以及對象容器。
缺點:使得設計變得更加復雜。
組合模式一般處理樹形結構,如下圖。
image.png
組合模式核心:
- 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();
}
}
結果:image.png
已完成測試!有不對的地方歡迎指出,感恩。