设计模式探秘之组合模式
Posted 洋葱头么
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式探秘之组合模式相关的知识,希望对你有一定的参考价值。
将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
/**
* 公司
*/
public abstract class Company {
String name;
public Company(String name) {
this.name = name;
}
abstract void add(Company company);
abstract void remove(Company company);
abstract void show(int depth);
abstract void other();
}
/**
* 分公司
*/
public class CompanyComposite extends Company {
private List<Company> children = Lists.newArrayList();
public CompanyComposite(String name) {
super(name);
}
public void add(Company company) {
children.add(company);
}
public void remove(Company company) {
children.remove(company);
}
public void show(int depth) {
System.out.println(Lists.newArrayList(new String[depth]).stream().map(i -> " ").reduce(String::concat).get() + super.name);
children.stream().forEach(company -> company.show(depth + 2));
}
public void other() {
children.stream().forEach(company -> company.other());
}
}
/**
* 人事部:叶子结点
*/
public class HRDept extends Company {
public HRDept(String name) {
super(name);
}
public void add(Company company) {
}
public void remove(Company company) {
}
public void show(int depth) {
System.out.println(Lists.newArrayList(new String[depth]).stream().map(i -> " ").reduce(String::concat).get() + super.name);
}
public void other() {
System.out.println(name + "招聘啦");
}
}
/**
* 销售部:叶子结点
*/
public class SaleDept extends Company {
public SaleDept(String name) {
super(name);
}
public void add(Company company) {
}
public void remove(Company company) {
}
public void show(int depth) {
System.out.println(Lists.newArrayList(new String[depth]).stream().map(i -> " ").reduce(String::concat).get() + super.name);
}
public void other() {
System.out.println(name + "“视频直播+摆地摊”卖货啦");
}
}
/**
* 测试
*/
public class Demo {
public static void main(String[] args) {
Company company = new CompanyComposite("总公司");
company.add(new HRDept("总公司人事部"));
company.add(new SaleDept("总公司销售部"));
Company child1 = new CompanyComposite("北京分公司");
child1.add(new HRDept("北京分公司人事部"));
child1.add(new SaleDept("北京分公司销售部"));
company.add(child1);
Company child2 = new CompanyComposite("上海分公司");
child2.add(new HRDept("上海分公司人事部"));
child2.add(new SaleDept("上海分公司销售部"));
company.add(child2);
Company child3 = new CompanyComposite("上海市黄浦区分公司");
child3.add(new SaleDept("上海市黄浦区销售部"));
child2.add(child3);
company.show(2);
company.other();
}
}
代码示例中company作为抽象接口,使得叶子节点即部门类和子部件即分公司类具有相同的行为,这样可以使部门类和分公司类被一致对待。
优点:可以一致地使用组合结构和单个对象。
缺点:客户端需要花更多时间理清类之间的层次关系。
组合模式的本质是统一叶子对象和组合对象,在将对象构建成树形结构的时候不需要区分。
以上是关于设计模式探秘之组合模式的主要内容,如果未能解决你的问题,请参考以下文章