《大话设计模式》java实现之组合模式
2017-11-20 09:39
477 查看
组合模式主要是体现部分与整体层次的结构,统一使用结构中的所有对象(书中原话)。
个人理解:组合模式多用于树状展现的内容中。
本示例省略书中的履行职责方法,这个对该模式没什么影响
UML图
代码结构
结果
多说一句,从上面可以看到HRDepartment和FinanceDepartment的display方法都是重复的代码,这个可以用模版方法模式进行优化,在父类定义一个方法template,然后子类调用,ConcreCompany调用父类后再添加自己的逻辑即可。
个人理解:组合模式多用于树状展现的内容中。
本示例省略书中的履行职责方法,这个对该模式没什么影响
UML图
代码结构
public class Client { public static void main(String[] args) { ConcreteCompany root = new ConcreteCompany("北京总公司"); root.add(new HRDepartment("总公司人力资源部")); root.add(new FinanceDepartment("总公司财务部")); ConcreteCompany comp = new ConcreteCompany("上海华东分公司"); comp.add(new HRDepartment("东分公司人力资源部")); comp.add(new FinanceDepartment("东分公司财务部")); root.add(comp); ConcreteCompany comp1 = new ConcreteCompany("南京办事处"); comp1.add(new HRDepartment("南京办事处人力资源部")); comp1.add(new FinanceDepartment("南京办事处财务部")); comp.add(comp1); ConcreteCompany comp2 = new ConcreteCompany("杭州办事处"); comp2.add(new HRDepartment("杭州办事处人力资源部")); comp2.add(new FinanceDepartment("杭州办事处财务部")); comp.add(comp2); System.out.println("结构图"); root.display(1); } }
public abstract class Company { private String name; //书中是procteced,为了和以往编程习惯一致,这里使用private public String getName() { return name; } public void setName(String name) { this.name = name; } public Company() { //保留无参构造方法 super(); } public Company(String name) { super(); this.name = name; } public abstract void add(Company company); public abstract void remove(Company company); public abstract void display(int depth); }
public class ConcreteCompany extends Company { private List<Company> children = new ArrayList<>(); 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 void display(int depth) { for(int i = 0; i < depth; i++) { //由于没有找到书中的类似方法,这里作了一个小循环 System.out.print("-"); } System.out.println(getName()); for(Company component : children) { component.display(depth + 2); } } }
public class FinanceDepartment extends Company { public FinanceDepartment(String name) { super(name); } @Override public void add(Company company) { } @Override public void remove(Company company) { } @Override public void display(int depth) { for(int i = 0; i < depth; i++) { //由于没有找到书中的类似方法,这里作了一个小循环 System.out.print("-"); } System.out.println(getName()); } }
public class HRDepartment extends Company { public HRDepartment(String name) { super(name); } @Override public void add(Company company) { } @Override public void remove(Company company) { } @Override public void display(int depth) { for(int i = 0; i < depth; i++) { //由于没有找到书中的类似方法,这里作了一个小循环 System.out.print("-"); } System.out.println(getName()); } }
结果
多说一句,从上面可以看到HRDepartment和FinanceDepartment的display方法都是重复的代码,这个可以用模版方法模式进行优化,在父类定义一个方法template,然后子类调用,ConcreCompany调用父类后再添加自己的逻辑即可。
相关文章推荐
- 大话设计模式2 策略模式 的java代码实现
- 设计模式之组合模式java实现
- 设计模式之第22章-组合模式(Java实现)
- Java 实现组合(Composite)模式
- 大话设计模式之外观模式(Java版实现) 买股票还是买基金在此揭晓
- 大话设计模式3 装饰模式 的java代码实现
- 大话设计模式--组合模式 Composite -- C++实现实例
- 大话设计模式之模板方法模式(Java版实现)考生做试卷问题
- 大话设计模式--java实现策略模式
- Java设计模式偷跑系列(十二)组合模式建模和实现
- 《大话设计模式》java实现之策略模式
- 《大话设计模式》读书笔记:策略模式+反射的Java实现
- 大话设计模式C++实现-第19章-组合模式
- java实现Composite(组合)模式
- Java 实现组合(Composite)模式
- Java函数接口实现函数组合及装饰器模式
- Java模板设计模式之基于组合实现
- 大话设计模式之状态模式(java版实现)
- 大话设计模式1 简单工厂模式 的java代码实现
- 大话设计模式C++实现-第19章-组合模式