java设计模式之——组合模式(结构型模式 )
接口的作用是什么?定义共性组合模式:主要是用来描述整体与部分的关系,用的最多的地方就是树形结构,我们先来说说组合模式的几个角色:抽象构件角色(Component):定义参加组合的对象的共有方法和属性,可以定义一些默认的行为或属性;比如我们例子中的getInfo 就封装到了抽象类中。叶子构件(Leaf):叶子对象,其下再也没有其他的分支。树枝构件(Composite):树枝对象,它的作用是组合树枝节点和叶子节点;组合模式有两种模式,透明模式和安全模式,这两个模式有什么区别呢 组合模式的优点有哪些呢?第一个优点只要是树形结构,就要考虑使用组合模式,这个一定记住,只要是要体现局部和整体的关系的时候,而且这种关系还可能比较深,考虑一下组合模式吧。组合模式有一个非常明显的缺点:使用了实现类而不是接口,违背了面向接口编程
?
package com.createtype.desginpatterns.composite3;/** * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you * all. 普通员工很简单,就写一个构造函数就可以了 */public class Leaf extends Corp {// 就写一个构造函数,这个是必须的public Leaf(String _name, String _position, int _salary) {super(_name, _position, _salary);}}package com.createtype.desginpatterns.composite3;/** * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you * all. 定义一个公司的人员的抽象类 */@SuppressWarnings("all")public abstract class Corp {// 公司每个人都有名称private String name = "";// 公司每个人都职位private String position = "";// 公司每个人都有薪水private int salary = 0;// 父节点是谁private Corp parent = null;/* * 通过接口的方式传递,我们改变一下习惯,传递进来的参数名以下划线开始 这个在一些开源项目中非常常见,一般构造函数都是这么定义的 */public Corp(String _name, String _position, int _salary) {this.name = _name;this.position = _position;this.salary = _salary;}// 获得员工信息public String getInfo() {String info = "";info = "姓名:" + this.name;info = info + "\t职位:" + this.position;info = info + "\t薪水:" + this.salary;return info;}// 设置父节点protected void setParent(Corp _parent) {this.parent = _parent;}// 得到父节点public Corp getParent() {return this.parent;}}package com.createtype.desginpatterns.composite3;import java.util.ArrayList;/** * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you * all. 组装这个树形结构,并展示出来 您的设计模式 第 166 页 */@SuppressWarnings("all")public class Client {public static void main(String[] args) {// 首先是组装一个组织结构出来Branch ceo = compositeCorpTree();// 首先把CEO的信息打印出来:System.out.println(ceo.getInfo());// 然后是所有员工信息System.out.println(getTreeInfo(ceo));}// 把整个树组装出来public static Branch compositeCorpTree() {// 首先产生总经理CEOBranch root = new Branch("王大麻子", "总经理", 100000);// 把三个部门经理产生出来Branch developDep = new Branch("刘大瘸子", "研发部门经理", 10000);Branch salesDep = new Branch("马二拐子", "销售部门经理", 20000);Branch financeDep = new Branch("赵三驼子", "财务部经理", 30000);// 再把三个小组长产生出来Branch firstDevGroup = new Branch("杨三乜斜", "开发一组组长", 5000);Branch secondDevGroup = new Branch("吴大棒槌", "开发二组组长", 6000);// 把所有的小兵都产生出来Leaf a = new Leaf("a", "开发人员", 2000);Leaf b = new Leaf("b", "开发人员", 2000);Leaf c = new Leaf("c", "开发人员", 2000);Leaf d = new Leaf("d", "开发人员", 2000);Leaf e = new Leaf("e", "开发人员", 2000);Leaf f = new Leaf("f", "开发人员", 2000);Leaf g = new Leaf("g", "开发人员", 2000);Leaf h = new Leaf("h", "销售人员", 5000);Leaf i = new Leaf("i", "销售人员", 4000);Leaf j = new Leaf("j", "财务人员", 5000);Leaf k = new Leaf("k", "CEO秘书", 8000);Leaf zhengLaoLiu = new Leaf("郑老六", "研发部副经理", 20000);// 开始组装// CEO下有三个部门经理和一个秘书root.addSubordinate(k);root.addSubordinate(developDep);root.addSubordinate(salesDep);root.addSubordinate(financeDep);// 研发部经理developDep.addSubordinate(zhengLaoLiu);developDep.addSubordinate(firstDevGroup);developDep.addSubordinate(secondDevGroup);// 看看开发两个开发小组下有什么firstDevGroup.addSubordinate(a);firstDevGroup.addSubordinate(b);firstDevGroup.addSubordinate(c);secondDevGroup.addSubordinate(d);secondDevGroup.addSubordinate(e);secondDevGroup.addSubordinate(f);// 再看销售部下的人员情况salesDep.addSubordinate(h);salesDep.addSubordinate(i);// 最后一个财务financeDep.addSubordinate(j);return root;}// 遍历整棵树,只要给我根节点,我就能遍历出所有的节点public static String getTreeInfo(Branch root) {ArrayList<Corp> subordinateList = root.getSubordinate(); // 做了修改String info = "";for (Corp s : subordinateList) { // 做了修改if (s instanceof Leaf) { // 是员工就直接获得信息info = info + s.getInfo() + "\n";} else { // 是个小头目info = info + s.getInfo() + "\n" + getTreeInfo((Branch) s);}}return info;}}package com.createtype.desginpatterns.composite3;import java.util.ArrayList;/** * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you * all. 节点类,也简单了很多 */public class Branch extends Corp {// 领导下边有那些下级领导和小兵ArrayList<Corp> subordinateList = new ArrayList<Corp>();// 构造函数是必须的了public Branch(String _name, String _position, int _salary) {super(_name, _position, _salary);}// 增加一个下属,可能是小头目,也可能是个小兵public void addSubordinate(Corp corp) {this.subordinateList.add(corp);corp.setParent(this); // 设置父节点}// 我有哪些下属public ArrayList<Corp> getSubordinate() {return this.subordinateList;}}