设计模式探秘之组合模式

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); }
@Override public void add(Company company) { children.add(company); } @Override public void remove(Company company) { children.remove(company); } @Override 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)); } @Override public void other() { children.stream().forEach(company -> company.other()); }}
/** * 人事部:叶子结点 */public class HRDept extends Company { public HRDept(String name) { super(name); }
@Override public void add(Company company) {
} @Override public void remove(Company company) {
} @Override public void show(int depth) { System.out.println(Lists.newArrayList(new String[depth]).stream().map(i -> " ").reduce(String::concat).get() + super.name); } @Override public void other() { System.out.println(name + "招聘啦"); }}

/** * 销售部:叶子结点 */public class SaleDept extends Company { public SaleDept(String name) { super(name); }
@Override public void add(Company company) {
} @Override public void remove(Company company) {
} @Override public void show(int depth) { System.out.println(Lists.newArrayList(new String[depth]).stream().map(i -> " ").reduce(String::concat).get() + super.name); } @Override 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作为抽象接口,使得叶子节点即部门类和子部件即分公司类具有相同的行为,这样可以使部门类和分公司类被一致对待。

优缺点

优点:可以一致地使用组合结构和单个对象。

缺点:客户端需要花更多时间理清类之间的层次关系。

思考总结

组合模式的本质是统一叶子对象和组合对象,在将对象构建成树形结构的时候不需要区分。

以上是关于设计模式探秘之组合模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式探秘之适配器模式

设计模式探秘之单例模式

23种设计模式之组合模式代码实例

php设计模式探秘-封装

设计模式之组合模式

设计模式之组合模式