设计模式之组合模式
来源:互联网 发布:淘宝销售直接进销存 编辑:程序博客网 时间:2024/06/15 14:19
简介
组合模式(Composite Pattern)也叫合成模式,有时又叫部分-整体模式,主要用来描述部分也整体的关系;主要是将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个和组合对象的使用具有一致性。
优点:
- 高层模块调用简单。
- 节点自由增加。
缺点:
在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
类图
Component:抽象构建角色,定义参加组合对象的共有方法和属性,可以定义一些默认的行为和属性,
Leaf:叶子构件,叶子对象,下面再也没有其他的分支。
Composite:树枝构件,树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构。
例:一个公司中员工的结构就能用该模式来表示;类图:
java实现
创建抽象的公司职员类
public abstract class Corp { //员工姓名 private String name = ""; //员工职位 private String position = ""; //员工薪水 private int salary = 0; public Corp(String name, String position, int salary) { this.name = name; this.position = position; this.salary = salary; } //获得员工信息 public String getInfo(){ StringBuffer sb = new StringBuffer(); sb.append("姓名:"+this.name); sb.append("\t职位:"+this.position); sb.append("\t薪水:"+this.salary); return sb.toString(); } }
创建树叶节点
public class Leaf extends Corp { public Leaf(String name, String position, int salary) { super(name, position, salary); } }
创建树枝节点
public class Branch extends Corp { //该员工下的员工 protected List<Corp> subordinateList = new ArrayList<>(); public Branch(String name, String position, int salary) { super(name, position, salary); } //添加下属员工 public void addSubordinate(Corp corp){ this.subordinateList.add(corp); } //得到下属员工 public List<Corp> getSubordinate() { return this.subordinateList; } }
场景类
public class Client { //添加公司员工信息 public static Branch createCorpTree(){ Branch root = new Branch("John","CEO", 30000); Branch decelopeDep = new Branch("Robert","研发部经理", 20000); Branch salesDep = new Branch("Michel","销售部经理", 20000); Branch firstGroup = new Branch("Laura","开发一组组长", 10000); Branch secondGroup = new Branch("Bob","开发二组组长", 10000); Leaf a = new Leaf("a","开发人员",5000); Leaf b = new Leaf("b","开发人员",5000); Leaf c = new Leaf("c","开发人员",5000); Leaf d = new Leaf("d","开发人员",5000); Leaf e = new Leaf("e","销售人员",5000); Leaf f = new Leaf("f","销售人员",5000); //组装员工 root.addSubordinate(decelopeDep); root.addSubordinate(salesDep); salesDep.addSubordinate(e); salesDep.addSubordinate(f); decelopeDep.addSubordinate(firstGroup); decelopeDep.addSubordinate(secondGroup); firstGroup.addSubordinate(a); firstGroup.addSubordinate(b); secondGroup.addSubordinate(c); secondGroup.addSubordinate(d); return root; } //遍历整棵树 public static String getTreeInfo(Branch root){ List<Corp> subordinate = root.getSubordinate(); StringBuffer sb = new StringBuffer(); for(Corp s :subordinate){ if(s instanceof Leaf){ sb.append(s.getInfo()+"\n"); }else{ sb.append("=================\n"+s.getInfo()+"\n"+getTreeInfo((Branch) s)); } } return sb.toString(); } public static void main(String[] args){ //首先创建出公司员工结构 Branch corpTree = createCorpTree(); System.out.println(corpTree.getInfo()); System.out.println(getTreeInfo(corpTree)); } }
整个公司员工的结构如下:
遍历结果:
阅读全文
0 0
- 设计模式之组合模式
- 设计模式之组合模式
- 设计模式之组合模式
- 设计模式之--组合模式
- 设计模式之组合模式
- 设计模式之组合模式
- 设计模式之组合模式
- 设计模式之组合模式
- 设计模式之---组合模式
- 设计模式之组合模式
- 设计模式之组合模式
- 设计模式之-------------组合模式
- 设计模式之组合模式
- 设计模式之组合模式
- 设计模式之组合模式
- 设计模式 之 组合模式
- 设计模式之组合模式
- 设计模式之组合模式
- flv 播放直播视频
- [JAVA学习笔记-93]DatagramSocket的线程安全性
- 小学生算术
- C语言的##运算符-预处理器的粘合剂
- Kotlin基本语法
- 设计模式之组合模式
- 技术博客3
- Tomcat修改首页
- 适配器模式-充电器为例
- python面向对象初级
- 金蝶EAS,分录表格数据唯一性校验,不允许录入重复值
- androidstudio中AIDL的使用详解
- 工厂方法模式
- Android camera fw学习(二)-open camera操作过程&准备工作分析。