组合模式

来源:互联网 发布:淘宝广告直通车 编辑:程序博客网 时间:2024/05/16 17:58

  • 组合模式Composite Pattern
    • 定义
    • 意义
    • 类图
    • 例子

组合模式(Composite Pattern)

定义

允许将对象组合成树形结构来表现“整体-部分”层次结构。组合让客户以一致的方式处理个别对象和对象组合。

意义

  • 组合模式能让我们用树形方式创建对象的结构,树里面包含组合以及个别对象
  • 使用组合结构我们能把相同的操作应用在组合和个别对象上,即在大多数情况下,我们可以忽略组合和个别对象之间的差别

类图

组合类图
所有的组件都必须实现Component接口,然而,叶节点和组合结点的角色不同,所以有些方法对于叶节点来说可能并没有意义,我们可以抛出运行时异常(UnsupportedOperationException)

例子

  • 结构图
    例子结构图
  • Component
public abstract class Employer {    private String name;    public void setName(String name) {        this.name = name;    }    public String getName() {        return this.name;    }    public abstract void add(Employer employer);    public abstract void delete(Employer employer);    public List employers;    public void printInfo() {        System.out.println(name);    }    public List getEmployers() {        return this.employers;    }}
  • Leaf
public class Programmer extends Employer {    public Programmer(String name) {        setName(name);        employers = null;//程序员, 表示没有下属了    }    public void add(Employer employer) {    }    public void delete(Employer employer) {    }}
public class ProjectAssistant extends Employer {    public ProjectAssistant(String name) {        setName(name);        employers = null;//项目助理, 表示没有下属了    }    public void add(Employer employer) {    }    public void delete(Employer employer) {    }}
  • Composite
public class ProjectManager extends Employer {    public ProjectManager(String name) {        setName(name);        employers = new ArrayList();    }    public void add(Employer employer) {        employers.add(employer);    }    public void delete(Employer employer) {        employers.remove(employer);    }}
  • Client
public class Test {    public static void main(String[] args) {        Employer pm = new ProjectManager("项目经理");        Employer pa = new ProjectAssistant("项目助理");        Employer programmer1 = new Programmer("程序员一");        Employer programmer2 = new Programmer("程序员二");        pm.add(pa);//为项目经理添加项目助理        pm.add(programmer2);//为项目经理添加程序员        List ems = pm.getEmployers();        for (Employer em : ems) {            System.out.println(em.getName());        }    }}
  • result
    项目助理
    程序员二

例子参考http://www.crazyit.org

原创粉丝点击