设计模式(17)之组合模式

2019-07-05  本文已影响0人  zhglance

组合模式(Composite Pattern),又叫部分整体模式,将一组相似的对象当做单一的对象,将对象组合成树形结构,以表示部分和整体的层次结构,组合模式。

一、需求举例:

在一个项目团队中,有一个高级工程师,高级工程师下有中级工程师和初级工程师,中级工程师下有初级工程师。

二、类图:

三、代码实例:

1.工程师父类:Engineer

package com.lance.component;


public abstract class Engineer {

    protected String name;

    public Engineer(String name) {
        this.name = name;
    }

    public abstract void add(Engineer engineer);


    void develop(String program) {
        System.out.println("Engineer default refuse " + program);
    }


}

2.初级工程师类:JuniorEngineer

package com.lance.component;

public class JuniorEngineer extends Engineer {

    public JuniorEngineer(String name) {
        super(name);
    }

    @Override
    public void add(Engineer engineer) {

    }


    @Override
    public void develop(String program) {
        System.out.println(program +  " developed by " + name);

    }

}

3.中级工程师:

package com.lance.component;

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

public class IntermediateEngineer extends Engineer {

    private List<Engineer> subEngineers = new ArrayList<>();

    public IntermediateEngineer(String name) {
        super(name);
    }

    @Override
    public void add(Engineer engineer) {
        subEngineers.add(engineer);
    }


    @Override
    public void develop(String program) {
        System.out.println(program + " developed by " + name);

        for (Engineer engineer : subEngineers) {
            if(program.startsWith("∟")) {
                engineer.develop("  " + program);
            } else {
                engineer.develop("∟" + program);
            }
        }
    }
}

4.高级工程师:SeniorEngineer

package com.lance.component;

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

public class SeniorEngineer extends Engineer {

    private List<Engineer> subEngineers = new ArrayList<>();

    public SeniorEngineer(String name) {
        super(name);
    }

    @Override
    public void add(Engineer engineer) {
        subEngineers.add(engineer);
    }


    @Override
    public void develop(String program) {
        System.out.println(program +  " developed by " + name);

        for (Engineer engineer : subEngineers) {
            if(program.startsWith("∟")) {
                engineer.develop("  " + program);
            } else {
                engineer.develop("∟" + program);
            }
        }

    }
}

5.主类:

package com.lance.component;

public class ComponentPattern {

    public static void main(String[] args) {


        System.out.println("==========start==========");

        SeniorEngineer leader = new SeniorEngineer("team leader");
        leader.add(new IntermediateEngineer("中级工程师-A"));
        Engineer engineer = new IntermediateEngineer("中级工程师-B");
        engineer.add(new JuniorEngineer("初级工程师-D"));
        leader.add(engineer);

        Engineer intermediateEngineer =new IntermediateEngineer("中级工程师-C");
        intermediateEngineer.add(new JuniorEngineer("初级工程师-A"));
        intermediateEngineer.add(new JuniorEngineer("初级工程师-B"));

        leader.add(intermediateEngineer);
        leader.add(new JuniorEngineer("初级工程师-C"));


        leader.develop("[program]");

        System.out.println("==========end==========");

    }
}

输出结果:

==========start==========
[program] developed by team leader
∟[program] developed by 中级工程师-A
∟[program] developed by 中级工程师-B
  ∟[program] developed by 初级工程师-D
∟[program] developed by 中级工程师-C
  ∟[program] developed by 初级工程师-A
  ∟[program] developed by 初级工程师-B
∟[program] developed by 初级工程师-C
==========end==========
上一篇 下一篇

猜你喜欢

热点阅读