Design Pattern(7)-Composite Pattern

来源:互联网 发布:电脑上打轴的软件 编辑:程序博客网 时间:2024/04/29 02:20

适用场景

组合模式适用于树形结构。试想一个公司的所有员工,肯定有上下级关系,除了最底层的员工,其他员工都有自己的领导和自己管理的员工。Composite Pattern通过让每个非最底层员工持有自己的直接下属,从而实现这种树形结构。
因为公司的每个员工都具有一些共性,所以为他们设计一个公共父类或者接口,譬如Component或者叫Employee。但是最低层员工和非最底层员工有一些区别,因为最底层员工不允许添加下属,所以再设两个子类。

类图

这里写图片描述

实例代码

Component

public interface Component {    void add(Component component);    void remove(Component component);    void action();    Component getChild(int index);}

Composite:

import java.util.ArrayList;import java.util.List;public class Composite implements  Component{    private String num;    List<Component> children;    public Composite(String num) {        this.num=num;        this.children=new ArrayList<>();    }    @Override    public void add(Component component) {        if(!children.contains(component))            children.add(component);    }    @Override    public void remove(Component component) {        if(children.contains(component))            children.remove(component);    }    @Override    public void action() {        for(Component component:children)            component.action();        System.out.print(this.num+"\t");    }    @Override    public Component getChild(int index) {        return children.get(index);    }}

LeafEmployee:

public class LeafEmployee implements Component{    private String name;    public LeafEmployee(String name) {        this.name=name;    }    @Override    public void add(Component component) {        return;    }    @Override    public void remove(Component component) {        return;    }    @Override    public void action() {        System.out.print(this.name+"\t");    }    @Override    public Component getChild(int index) {        return null;    }}

Client:

public class Client {    public static void main(String[] args){        Component manager=new Composite("总经理");        Component vice_manager=new Composite("副经理");        Component leaf1=new LeafEmployee("小张");        Component leaf2=new LeafEmployee("小王");        manager.add(vice_manager);        vice_manager.add(leaf1);        vice_manager.add(leaf2);        manager.action();    }}
0 0
原创粉丝点击