您的位置:首页 > 编程语言 > Java开发

《大话设计模式》java实现之组合模式

2017-11-20 09:39 477 查看
组合模式主要是体现部分与整体层次的结构,统一使用结构中的所有对象(书中原话)。

个人理解:组合模式多用于树状展现的内容中。

本示例省略书中的履行职责方法,这个对该模式没什么影响

UML图



代码结构



public class Client {
public static void main(String[] args) {
ConcreteCompany root = new ConcreteCompany("北京总公司");
root.add(new HRDepartment("总公司人力资源部"));
root.add(new FinanceDepartment("总公司财务部"));

ConcreteCompany comp = new ConcreteCompany("上海华东分公司");
comp.add(new HRDepartment("东分公司人力资源部"));
comp.add(new FinanceDepartment("东分公司财务部"));
root.add(comp);

ConcreteCompany comp1 = new ConcreteCompany("南京办事处");
comp1.add(new HRDepartment("南京办事处人力资源部"));
comp1.add(new FinanceDepartment("南京办事处财务部"));
comp.add(comp1);

ConcreteCompany comp2 = new ConcreteCompany("杭州办事处");
comp2.add(new HRDepartment("杭州办事处人力资源部"));
comp2.add(new FinanceDepartment("杭州办事处财务部"));
comp.add(comp2);

System.out.println("结构图");
root.display(1);
}
}


public abstract class Company {
private String name;     //书中是procteced,为了和以往编程习惯一致,这里使用private

public String getName() {
return name;
}

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

public Company() {                  //保留无参构造方法
super();
}

public Company(String name) {
super();
this.name = name;
}

public abstract void add(Company company);
public abstract void remove(Company company);
public abstract void display(int depth);
}


public class ConcreteCompany extends Company {

private List<Company> children = new ArrayList<>();

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

@Override
public void add(Company company) {
children.add(company);
}

@Override
public void remove(Company company) {
children.remove(company);
}

@Override
public void display(int depth) {
for(int i = 0; i < depth; i++) {   //由于没有找到书中的类似方法,这里作了一个小循环
System.out.print("-");
}
System.out.println(getName());

for(Company component : children) {
component.display(depth + 2);
}
}

}


public class FinanceDepartment extends Company {

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

@Override
public void add(Company company) {

}

@Override
public void remove(Company company) {

}

@Override
public void display(int depth) {
for(int i = 0; i < depth; i++) {   //由于没有找到书中的类似方法,这里作了一个小循环
System.out.print("-");
}
System.out.println(getName());
}

}


public class HRDepartment extends Company {

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

@Override
public void add(Company company) {

}

@Override
public void remove(Company company) {

}

@Override
public void display(int depth) {
for(int i = 0; i < depth; i++) {   //由于没有找到书中的类似方法,这里作了一个小循环
System.out.print("-");
}
System.out.println(getName());
}

}


结果



多说一句,从上面可以看到HRDepartment和FinanceDepartment的display方法都是重复的代码,这个可以用模版方法模式进行优化,在父类定义一个方法template,然后子类调用,ConcreCompany调用父类后再添加自己的逻辑即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: