首页 > 代码库 > 设计模式14---组合模式

设计模式14---组合模式

组合模式可以理解为是树的结构的一种构建方式。

Composite是可以拓展的树的分支,树理论上可以无限长。

 

package com.jayfulmath.designpattern.composite;public abstract class Company {        protected String name;    public Company(String name) {        this.name = name;    }        public abstract void Add(Company c);    public abstract void Remove(Company c);    public abstract void Display(int depth);    public abstract void LineofDuty();        protected void printfObjectName(int depth) {        StringBuilder builder = new StringBuilder();        for(int i=0;i<depth;i++)        {            builder.append("-");        }                System.out.println(builder.toString()+name);    }}
package com.jayfulmath.designpattern.composite;public class FianceDepartment extends Company {    public FianceDepartment(String name) {        super(name);        // TODO Auto-generated constructor stub    }    @Override    public void Add(Company c) {        // TODO Auto-generated method stub    }    @Override    public void Remove(Company c) {        // TODO Auto-generated method stub    }    @Override    public void Display(int depth) {        // TODO Auto-generated method stub        printfObjectName(depth);    }    @Override    public void LineofDuty() {        // TODO Auto-generated method stub        System.out.println(name+"\t staff payoff");    }}
package com.jayfulmath.designpattern.composite;public class HRDepartment extends Company {    public HRDepartment(String name) {        super(name);        // TODO Auto-generated constructor stub    }    @Override    public void Add(Company c) {        // TODO Auto-generated method stub    }    @Override    public void Remove(Company c) {        // TODO Auto-generated method stub    }    @Override    public void Display(int depth) {        // TODO Auto-generated method stub        printfObjectName(depth);    }    @Override    public void LineofDuty() {        // TODO Auto-generated method stub        System.out.println(name+"\t staff recruitment ");    }}
package com.jayfulmath.designpattern.composite;import com.jayfulmath.designpattern.main.BasicExample;public class CompositeMain extends BasicExample {    @Override    public void startDemo() {        // TODO Auto-generated method stub        CompositeCompany root = new CompositeCompany("北京总公司");        root.Add(new HRDepartment("总公司HR"));        root.Add(new FianceDepartment("总公司FD"));                CompositeCompany comp = new CompositeCompany("上海分公司");        comp.Add(new HRDepartment("上海分公司HR"));        comp.Add(new FianceDepartment("上海分公司FD"));        root.Add(comp);                CompositeCompany comp1 = new CompositeCompany("浦东办事处");        comp1.Add(new HRDepartment("浦东办事处HR"));        comp1.Add(new FianceDepartment("浦东办事处FD"));        comp.Add(comp1);                CompositeCompany comp2 = new CompositeCompany("人民广场办事处");        comp2.Add(new HRDepartment("人民广场办事处HR"));        comp2.Add(new FianceDepartment("人民广场办事处FD"));        comp.Add(comp2);                System.out.println("结构图:");        root.Display(1);                System.out.println("职责:");        root.LineofDuty();    }}
package com.jayfulmath.designpattern.composite;import com.jayfulmath.designpattern.main.BasicExample;public class CompositeMain extends BasicExample {    @Override    public void startDemo() {        // TODO Auto-generated method stub        CompositeCompany root = new CompositeCompany("北京总公司");        root.Add(new HRDepartment("总公司HR"));        root.Add(new FianceDepartment("总公司FD"));                CompositeCompany comp = new CompositeCompany("上海分公司");        comp.Add(new HRDepartment("上海分公司HR"));        comp.Add(new FianceDepartment("上海分公司FD"));        root.Add(comp);                CompositeCompany comp1 = new CompositeCompany("浦东办事处");        comp1.Add(new HRDepartment("浦东办事处HR"));        comp1.Add(new FianceDepartment("浦东办事处FD"));        comp.Add(comp1);                CompositeCompany comp2 = new CompositeCompany("人民广场办事处");        comp2.Add(new HRDepartment("人民广场办事处HR"));        comp2.Add(new FianceDepartment("人民广场办事处FD"));        comp.Add(comp2);                System.out.println("结构图:");        root.Display(1);                System.out.println("职责:");        root.LineofDuty();    }}

运行结果:

结构图:-北京总公司---总公司HR---总公司FD---上海分公司-----上海分公司HR-----上海分公司FD-----浦东办事处-------浦东办事处HR-------浦东办事处FD-----人民广场办事处-------人民广场办事处HR-------人民广场办事处FD职责:总公司HR     staff recruitment 总公司FD     staff payoff上海分公司HR     staff recruitment 上海分公司FD     staff payoff浦东办事处HR     staff recruitment 浦东办事处FD     staff payoff人民广场办事处HR     staff recruitment 人民广场办事处FD     staff payoff

 

Leaf 是没有add和remove功能的,但是保留这两个接口可以是代码保持统一性.

 

设计模式14---组合模式