组合模式--Composite

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

Composite好处:
  1.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。
  2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。

如何使用Composite?
  首先定义一个接口或抽象类,这是设计模式通用方式了,其他设计模式对接口内部定义限制不多,Composite却有个规定,那就是要在接口内部定义一个用于访问和管理Composite组合体的对象们(或称部件Component)

package com.qinsoft.design;

import java.util.ArrayList;
import java.util.List;

abstract class Employer
{
    private String name;

    public void setName(String name)
    {
        this.name = name;
    }

    public String getName()
    {
        return this.name;
    }

    abstract void add(Employer employer);

    abstract void delete(Employer employer);

    List<Employer> employers;

    void printInfo()
    {
        System.out.println(name);
    }

    List<Employer> getEmployers()
    {
        return this.employers;
    }
}

//Leaf
class Programmer extends Employer
{

    Programmer(String name)
    {
        setName(name);
        employers = null;
    }

    void add(Employer employer)
    {

    }

    void delete(Employer employer)
    {

    }

}

class ProjectAssistant extends Employer
{

    ProjectAssistant(String name)
    {
        setName(name);
        employers = null;
    }

    void add(Employer employer)
    {
    }

    void delete(Employer employer)
    {
    }

}

class Projectmanager extends Employer
{
    Projectmanager()
    {
        employers = new ArrayList<Employer>();
    }

    Projectmanager(String name)
    {
        setName(name);
        employers = new ArrayList<Employer>();
    }

    public void add(Employer employer)
    {
        employers.add(employer);
    }

    void delete(Employer employer)
    {
        employers.remove(employer);
    }
}

public class Composite
{

    public static void main(String[] args)
    {
        Employer pm = new Projectmanager();
        Employer pa = new ProjectAssistant("项目助理");
        Employer programer1 = new Programmer("程序员一");
        Employer programer2 = new Programmer("程序员二");

        pm.add(pa);
        pm.add(programer2);

        List<Employer> ems = pm.getEmployers();

        for (Employer em : ems)
        {
            System.out.println(em.getName());
        }

    }
}

 

posted @ 2013-01-18 11:22  何长春  阅读(181)  评论(0编辑  收藏  举报