JAVA设计模式:组合模式
2016-01-22 14:05
477 查看
组合(整体与部分关系)模式:将不同但是相关的对象组合成树形结构以实现“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
* 模式角色组成:
* 1.Component对象: 是组合中的对象接口,是所有类共有的接口。是用于统一定义整体中的部分。
2.Leaf对象: 整体中的部分,没有下一级。
3.Composite对象: 用来存储子部件,在Component接口中实现与部分有关操作。
以公司构成为例,比如公司有总公司,总公司下有分公司,分公司下有办事处等。构成一个树形结构。
* 模式角色组成:
* 1.Component对象: 是组合中的对象接口,是所有类共有的接口。是用于统一定义整体中的部分。
2.Leaf对象: 整体中的部分,没有下一级。
3.Composite对象: 用来存储子部件,在Component接口中实现与部分有关操作。
以公司构成为例,比如公司有总公司,总公司下有分公司,分公司下有办事处等。构成一个树形结构。
/** * 抽象类:用来管理子类 * @description: * @date 2016-1-22 下午1:16:25 */ public abstract class Firm { private String firmName;// 公司名称 public Firm(String firmName) { this.firmName = firmName; } public String getFirmName() { return firmName; } public void setFirmName(String name) { this.firmName = name; } protected abstract void append(Firm firm);// 添加公司如:新增分公司 protected abstract void romove(Firm firm);// 删除公司:如因故关闭分公司 protected abstract void show(int level);//显示公司所在的层级:总公司,分公司,办事处等 }
/** * 分公司对象 * @description: * @date 2016-1-22 下午1:25:43 */ public class BranchFirm extends Firm { private List<Firm> cList; public BranchFirm(String name) { super(name); cList = new ArrayList<Firm>(); } @Override protected void append(Firm firm) { cList.add(firm); } @Override protected void show(int depth) { StringBuilder sb = new StringBuilder(""); for (int i = 0; i < depth; i++) { sb.append("*"); } System.out.println(new String(sb) + this.getFirmName()); for (Firm c : cList) { c.show(depth + 2); } } @Override protected void romove(Firm firm) { // TODO Auto-generated method stub cList.remove(firm); } }
/** * Leaf结点类:公司市场部 * @description: * @date 2016-1-22 下午1:46:02 */ public class MarketDepartment extends Firm { public MarketDepartment(String name) { super(name); } @Override protected void append(Firm company) { } @Override protected void show(int depth) { // TODO Auto-generated method stub StringBuilder sb = new StringBuilder(""); for (int i = 0; i < depth; i++) { sb.append("*"); } System.out.println(new String(sb) + this.getFirmName()); } @Override protected void romove(Firm company) { } }
/** * Leaf结点类:公司技术部 * @description: * @date 2016-1-22 下午1:21:41 */ public class MinTechDepartment extends Firm { public MinTechDepartment(String name) { super(name); } @Override protected void append(Firm firm) { } @Override protected void show(int depth) { StringBuilder sb = new StringBuilder(""); for (int i = 0; i < depth; i++) { sb.append("*"); } System.out.println(new String(sb) + this.getFirmName()); } @Override protected void romove(Firm company) { } }
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Firm head = new BranchFirm("深圳XX集团有限公司");// 公司总部 head.append(new MarketDepartment("深圳XX集团有限公司--市场部")); head.append(new MinTechDepartment("深圳XX集团有限公司--技术部")); Firm jsFirm = new BranchFirm("深圳XX集团有限公司-江苏分公司"); jsFirm.append(new MarketDepartment("深圳XX集团有限公司-江苏分公司市场部")); jsFirm.append(new MinTechDepartment("深圳XX集团有限公司-江苏分公司技术部")); Firm szFirm = new BranchFirm("深圳XX集团有限公司-江苏分公司-苏州办事处"); szFirm.append(new MinTechDepartment("深圳XX集团有限公司-江苏分公司-苏州办事处技术部")); szFirm.append(new MarketDepartment("深圳XX集团有限公司-江苏分公司-苏州办事处市场部")); jsFirm.append(szFirm); // 如果还需要新增分公司或办事处等,就按照第19-25行操作 head.append(jsFirm); head.show(0); } } 通常:在需要表示对象的整体与部分层次结构或需要忽略组合的整体对象与部分对象的不同,统一地使用整体中的部门情况下来使用组合模式。
相关文章推荐
- eclipse快捷键汇总
- java基础篇--01<基础>
- java.lang.IllegalStateException: ScrollView can host only one direct child
- JavaEE 之 JPA 常见异常处理办法汇总
- 关于struts2的那点事
- static关键字--java
- Vector and ArrayList in Java
- Java 方法
- 手动编译JAVA类
- JavaSE001_String类总结之构造器和常用方法
- android studio 导入eclipse遇到的相关问题
- java ftp相关的异常汇总
- Spring+MVC项目发布停止
- java前台传参json,后台用map或者实体对象接收
- java.lang.RuntimeException: JPedal Trial has now expired
- java 实现多线程的三种基本方式
- 深度分析 Java 的枚举类型:枚举的线程安全性及序列化问题
- JAVA注解
- eclipse中安装mybatis快捷进入插件
- 浅析Java中的深拷贝和浅拷