设计模式(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==========