《大话设计模式》java实现之组合模式
来源:互联网 发布:泼墨门事件知乎 编辑:程序博客网 时间:2024/06/05 08:34
组合模式主要是体现部分与整体层次的结构,统一使用结构中的所有对象(书中原话)。
个人理解:组合模式多用于树状展现的内容中。
本示例省略书中的履行职责方法,这个对该模式没什么影响
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调用父类后再添加自己的逻辑即可。
阅读全文
0 0
- 《大话设计模式》java实现之组合模式
- 大话设计模式之组合模式
- 大话设计模式之组合模式
- 大话设计模式之组合模式
- 大话设计模式笔记之组合模式
- 大话设计模式之组合模式
- 大话设计模式读书笔记之组合模式
- 设计模式之组合模式java实现
- 大话设计-组合模式
- 大话设计模式-组合模式
- 大话设计模式 组合模式
- 大话设计模式-组合模式
- 大话设计模式-组合模式
- 大话设计模式之状态模式(java版实现)
- 《大话设计模式》java实现之简单工厂模式
- 《大话设计模式》java实现之策略模式
- 《大话设计模式》java实现之装饰器模式
- 《大话设计模式》java实现之代理模式
- 搭建SpringMVC项目——01 工具配置
- Chrome浏览器SS代理设置
- Spring Cloud构建微服务架构:服务消费(基础)
- 从零开始的计算机系统,从本质上深入理解计算机
- 编译 cocos2d-x 程序:eclipse (lua)
- 《大话设计模式》java实现之组合模式
- jpa的使用和详解
- SRS 代码分析【RTMP连接请求响应】
- HTTP-头域
- python dota2数据 2 英雄名和胜负
- leetcode 29. Divide Two Integers
- 机器学习(二十二)——推荐算法中的常用排序算法, Tri-training
- Tensorflow实战学习(二十)【序列标注、手写小写字母OCR数据集、双向RNN】
- DBCP2 配置