定义
组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对各个对象和组合对象的使用具有一致性。
结构图
image.png使用场景
-
透明方式就是说在Component中声明所有用来管理子对象方法,其中包含add和remove等。这样实现component接口的所有子类都具备add和remove。这样做的好处就是叶节点和枝节点对于外界来说没有区别,他们具备完全一致的接口。但是问题也很明显,因为leaf类本身不具备add和remove的功能,所以实现它是没有意义的。
-
如果考虑安全方式,也就是在component中不声明add和remove方法, 那么子类leaf就不需要去实现它,而是在composite声明所有用来管理子类对象的方法。不过由于不够透明,所以树叶和树枝类将不具备相同的接口,客户端的调用需要做相应的处理,也带来了一些不方便。
-
当你发现需求中体现部分和整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑使用组合模式了。
公司管理系统的例子
- 结构图
- Company,(Component),基类,定义统一的方法
/**
* 公司类,抽象类或者接口
*/
abstract class Company {
protected String name;
public Company(String name) {
this.name = name;
}
public abstract void add(Company company); // 增加
public abstract void remove(Company company); // 移除
public abstract String display(int depth); // 显示
public abstract String lineOfDuty(); // 履行职责
}
- ConcreteCompany,(Composite);有子节点的节点对象;总公司,分公司,办事处等
/**
* 具体公司类;实现接口;数枝节点
*/
class ConcreteCompany extends Company {
private ArrayList<Company> children = new ArrayList<Company>();
public ConcreteCompany(String name) {
super(name);
}
@Override
public void add(Company company) {
children.add(company);
}
@Override
public void remove(Company company) {
children.remove(company);
}
@Override
public String display(int depth) {
String message = new String();
for (int i = 0; i < depth; i++) {
message += "-";
}
message += name;
message += "\n";
for (Company company:
children) {
message += company.display(depth + 2);
}
return message;
}
@Override
public String lineOfDuty() {
String message = new String();
for (Company company:
children) {
message += company.lineOfDuty();
}
return message;
}
}
- HRDepartment, FinanceDepartment, (Leaf), 叶子;具体的部分,人力资源部,财务部等
class FinanceDepartment extends Company {
public FinanceDepartment(String name) {
super(name);
}
@Override
public void add(Company company) {
// 叶子节点; 什么也不做
}
@Override
public void remove(Company company) {
// 叶子节点; 什么也不做
}
@Override
public String display(int depth) {
String message = new String();
for (int i = 0; i < depth; i++) {
message += "-";
}
message += name;
message += "\n";
return message;
}
@Override
public String lineOfDuty() {
return name + "======" + "公司财务收支管理" + "\n";
}
}
/**
* 人力资源部; 叶子节点
*/
class HRDepartment extends Company {
public HRDepartment(String name) {
super(name);
}
@Override
public void add(Company company) {
// 叶子节点; 什么也不做
}
@Override
public void remove(Company company) {
// 叶子节点; 什么也不做
}
@Override
public String display(int depth) {
String message = new String();
for (int i = 0; i < depth; i++) {
message += "-";
}
message += name;
message += "\n";
return message;
}
@Override
public String lineOfDuty() {
return name + "======" + "员工招聘培训管理" + "\n";
}
}
- 测试界面
- 客户端程序
public class CompositeActivity extends AppCompatActivity {
public static void launch(Context context) {
if (null != context) {
Intent intent = new Intent();
intent.setClass(context, CompositeActivity.class);
if (!(context instanceof Activity)) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_composite);
setTitle("组合模式");
TextView treeTextView = findViewById(R.id.textViewTree);
TextView dutyTextView = findViewById(R.id.textViewDuty);
ConcreteCompany root = new ConcreteCompany("北京总公司");
root.add(new HRDepartment("总公司人力资源部"));
root.add(new FinanceDepartment("总公司财务部"));
ConcreteCompany company = new ConcreteCompany("上海华东分公司");
company.add(new HRDepartment("华东分公司人力资源部"));
company.add(new FinanceDepartment("华东分公司财务部"));
root.add(company);
ConcreteCompany nanjing = new ConcreteCompany("南京办事处");
nanjing.add(new HRDepartment("南京办事处人力资源部"));
nanjing.add(new FinanceDepartment("南京办事处财务部"));
company.add(nanjing);
ConcreteCompany hangzhou = new ConcreteCompany("杭州办事处");
hangzhou.add(new HRDepartment("杭州办事处人力资源部"));
hangzhou.add(new FinanceDepartment("杭州办事处财务部"));
company.add(hangzhou);
String tree = "结构图:\n" + root.display(1);
treeTextView.setText(tree);
String duty = "职责:\n" + root.lineOfDuty();
dutyTextView.setText(duty);
}
}
Demo地址
https://gitee.com/zhangxusong888/Android/tree/master/design_pattern
网友评论