java 组合模式(大话设计模式)
组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
需求中是体现部分与整体层次的结构时,希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑使用组合模式了。组合模式让客户可以一致地使用组合结构和单个对象。【继承+组合 】
/**
* Component为组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为。
*
* @author administrator
*
*/
public abstract class Component {
protected String name;
public Component(String name) {
this.name = name;
}
public abstract void add(Component component);
public abstract void remove(Component component);
public abstract void display(int depth);
}
/**
* 定义有枝节点行为,用来存储子部件
*
* @author administrator
*
*/
public class Composite extends Component {
private List<Component> children = new ArrayList<Component>();
public Composite(String name) {
super(name);
}
@Override
public void add(Component component) {
children.add(component);
}
@Override
public void remove(Component component) {
children.remove(component);
}
@Override
public void display(int depth) {
// 显示其枝节点名称,并对其下级进行遍历
System.out.println(StringUtil.repeatableString("-", depth) + this.name);
for (Component component : children) {
component.display(depth + 2);
}
}
}
/**
* Leaf在组合中表示叶节点对象,叶节点没有子节点
*
* @author administrator
*
*/
public class Leaf extends Component {
public Leaf(String name) {
super(name);
}
@Override
public void add(Component component) {
System.out.println("cannot add to a leaf");
}
@Override
public void remove(Component component) {
System.out.println("cannot remove from a leaf");
}
@Override
public void display(int depth) {
// 通过“-”的数目显示级别
System.out.println(StringUtil.repeatableString("-", depth) + this.name);
}
}
/**
* 客户端。通过Component接口操作组合部件的对象
*
* @author administrator
*
*/
public class CompositeClient {
public static void main(String[] args) {
// 生成树根,根上长出两叶Leaf A和Leaf B
Composite root = new Composite("root");
root.add(new Leaf("Leaf A"));
root.add(new Leaf("Leaf B"));
// 根上长出分支Composite X,分支上也有两叶Leaf X-A和Leaf X-B
Composite compositeX = new Composite("Composite X");
compositeX.add(new Leaf("Leaf X-A"));
compositeX.add(new Leaf("Leaf X-B"));
root.add(compositeX);
// 在Composite X上再长出分支Composite X-Y,分支上也有两叶Leaf X-Y-A和Leaf X-Y-B
Composite compositeXY = new Composite("Composite X-Y");
compositeXY.add(new Leaf("Leaf X-Y-A"));
compositeXY.add(new Leaf("Leaf X-Y-B"));
compositeX.add(compositeXY);
// 显示大树的样子
root.display(1);
}
}
案例 部门
/**
* 组合模式(Composite)
* 公司抽象类
*/
public abstract class Company {
protected String name;
public Company(String name) {
this.name = name;
}
public abstract void add(Company company);// 增加
public abstract void remove(Company company);// 移除
public abstract void display(int depth);// 显示
public abstract void lineOfDuty();// 职责
}
/**
* 组合模式(Composite)
* 具体公司类
*/
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) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < depth; i++) {
sb.append("-");
}
System.out.println(sb + name);
for (Company c : children) {
c.display(depth + 2);
}
}
@Override
public void lineOfDuty() {
for (Company c : children) {
c.lineOfDuty();
}
}
}
/**
* 组合模式(Composite)
* 财务部
*/
public class FinanceDepartment extends Company {
public FinanceDepartment(String name) {
super(name);
}
@Override
public void add(Company company) {
// None
}
@Override
public void remove(Company company) {
// None
}
@Override
public void display(int depth) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < depth; i++) {
sb.append("-");
}
System.out.println(sb + name);
}
@Override
public void lineOfDuty() {
System.out.println(name + " 公司财务收支管理");
}
}
/**
* 组合模式(Composite)
* 人力资源部
*/
public class HRDepartment extends Company {
public HRDepartment(String name) {
super(name);
}
@Override
public void add(Company company) {
// None
}
@Override
public void remove(Company company) {
// None
}
@Override
public void display(int depth) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < depth; i++) {
sb.append("-");
}
System.out.println(sb + name);
}
@Override
public void lineOfDuty() {
System.out.println(name + " 员工招聘管理培训");
}
}
/**
* 组合模式(Composite)
* 客户端main方法
*/
public class Client {
public static void main(String[] args) {
ConcreteCompany root = new ConcreteCompany("北京总公司");
root.add(new HRDepartment("总公司人力资源部"));
root.add(new FinanceDepartment("总公司财务部"));
ConcreteCompany company = new ConcreteCompany("上海华东分公司");
company.add(new HRDepartment("华东分公司人力资源部"));
company.add(new FinanceDepartment("华东分公司财务部"));
root.add(company);
ConcreteCompany company1 = new ConcreteCompany("南京办事处");
company1.add(new HRDepartment("南京办事处人力资源部"));
company1.add(new FinanceDepartment("南京办事处财务部"));
company.add(company1);
ConcreteCompany company2 = new ConcreteCompany("杭州办事处");
company2.add(new HRDepartment("杭州办事处人力资源部"));
company2.add(new FinanceDepartment("杭州办事处财务部"));
company.add(company2);
System.out.println("结构图:");
root.display(1);
System.out.println("职责:");
root.lineOfDuty();
}
}