组合模式

来源:互联网 发布:centos yum安装包下载 编辑:程序博客网 时间:2024/05/22 15:34

组合模式:将对象组成树形结构以表示部分与整体的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

实例

Component.java

/** * @author Carl_Hugo * 声明一个接口用于访问和管理Component子部件 */public abstract class Component {    protected String name;    public Component(String name){        this.name=name;    }    //用于增加删除子部件    public abstract void add(Component component);    public abstract void remove(Component component);    public abstract void display(int depth);}

Leaf.java

/** * 在组合中表示叶子节点 * @author Carl_Hugo */public class Leaf extends Component{    public Leaf(String name) {        super(name);    }    /**     * 叶子节点没有子节点     */    @Override    public void add(Component component) {        System.out.println("Can not add to a leaf!");    }    @Override    public void remove(Component component) {        System.out.println("Can not remove from a leaf");    }    @Override    public void display(int depth) {        String str="";        for(int i=0;i<depth;i++){            str+='-';        }        System.out.println(str+name);    }}

Composite.java

/** * Composite定义有枝节点行为,用于存储子部件(与叶子节点不同) * @author Carl_Hugo * */public class Composite extends Component{    private List<Component> children=new ArrayList<Component>();    public Composite(String name) {        super(name);    }    @Override    public void add(Component component) {        children.add(component);    }    @Override    public void remove(Component component) {        children.remove(component);    }    @Override    public void display(int depth) {        String str="";        for(int i=0;i<depth;i++){            str+='-';        }        System.out.println(str+name);        for(Component c:children){            c.display(depth+2);        }    }}

Test.java

public class Test {    public static void main(String[] args) {        Composite root = new Composite("root");        root.add(new Leaf("Leaf A"));        root.add(new Leaf("Leaf B"));        Composite comp = new Composite("Composite X");        comp.add(new Leaf("Leaf XA"));        comp.add(new Leaf("Leaf XB"));        root.add(comp);        Composite comp2 = new Composite("Component XY");        comp2.add(new Leaf("Leaf XYA"));        comp2.add(new Leaf("Leaf XYB"));        comp.add(comp2);        root.add(new Leaf("Leaf C"));        Leaf leaf = new Leaf("Leaf D");        root.add(leaf);        root.remove(leaf);        root.display(1);    }}

公司管理

Company.java

/** * 公司类,抽象接口 * @author Carl_Hugo * */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();}

ConcreteCompany.java

/** * 具体公司类,实现接口 * @author Carl_Hugo */public class ConcreteCompany extends Company{    private List<Company> children=new ArrayList<Company>();    public ConcreteCompany(String name) {        super(name);    }    @Override    public void add(Company c) {        children.add(c);    }    @Override    public void remove(Company c) {        children.remove(c);    }    @Override    public void display(int depth) {        String str="";        for(int i=0;i<depth;i++){            str+='-';        }        System.out.println(str+name);        for(Company c:children){            c.display(depth+2);        }    }    @Override    public void lineOfDuty() {        for(Company c:children){            c.lineOfDuty();        }    }}

FinanceDepartment.java

/** * 财务部,树叶节点 * @author Carl_Hugo */ public class FinanceDepartment extends Company{    public FinanceDepartment(String name) {        super(name);    }    @Override    public void add(Company c) {    }    @Override    public void remove(Company c) {    }    @Override    public void display(int depth) {        String str="";        for(int i=0;i<depth;i++){            str+='-';        }        System.out.println(str+name);    }    @Override    public void lineOfDuty() {        System.out.println(name+"公司财务收支管理");    }}

HRDepartment.java

/** * 人力资源部,树叶节点 * @author Carl_Hugo */public class HRDepartment extends Company{    public HRDepartment(String name) {        super(name);    }    @Override    public void add(Company c) {    }    @Override    public void remove(Company c) {    }    @Override    public void display(int depth) {        String str="";        for(int i=0;i<depth;i++){            str+='-';        }        System.out.println(str+name);    }    @Override    public void lineOfDuty() {        System.out.println(name+"员工招聘管理培训");    }}

Test.java

package zx.compositepattern.test2;public class Test {    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);        System.out.println("=======职责======");        root.lineOfDuty();    }}

0 0
原创粉丝点击