文章目录
组合模式
组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
应用场景:需求中是体现部分与整体的结构以及用户可以忽略组合对象对单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑用组合模式。
本质:统一子对象和组合对象。
缺点:很难限制组合中的组件类型。
一些典型例子:绘图编辑器,图形捕捉系统,drow.io
有两个要实现的例子,一个商品类别树,一个是公司管理的例子,这里以公司管理为例子。
package 公司管理;
public abstract class company {
protected String name;
public company(String name) {
this.name = name;
}
public abstract void add(company c);
public abstract void remove(company c);
public abstract void display(int depth);
public abstract void lvxingzhize();
}
package 公司管理;
public class caiwubu extends company {
public caiwubu(String name) {
super(name);
}
@Override
public void add(company c) {
System.out.println("不能再加叶子");
}
@Override
public void remove(company c) {
System.out.println("不能再减少叶子");
}
@Override
public void display(int depth) {
String str = "";
for (int i = 0; i < depth; i++) {
str += "-";
}
System.out.println(str + name);
}
@Override
public void lvxingzhize() {
System.out.println(name + ":负责员工招聘管理");
}
}
package 公司管理;
public class renliziyuanbu extends company {
public renliziyuanbu(String name) {
super(name);
}
@Override
public void add(company c) {
System.out.println("不能再加叶子");
}
@Override
public void remove(company c) {
System.out.println("不能再减少叶子");
}
@Override
public void display(int depth) {
String str = "";
for (int i = 0; i < depth; i++) {
str += "-";
}
System.out.println(str + name);
}
@Override
public void lvxingzhize() {
System.out.println(name + ":公司财务收支管理");
}
}
package 公司管理;
import java.util.ArrayList;
import java.util.List;
public class concreteCompany extends company {
private List<company> children = new ArrayList<company>();
public concreteCompany(String name) {
super(name);
}
@Override
public void add(company c) {
children.add(c);
}
@Override
public void remove(company c) {
children.remove(c);
}
@Override
public void display(int depth) {
String str = "";
for (int i = 0; i < depth; i++) {
str += "-";
}
System.out.println(str + name);
for (int i = 0; i < children.size(); i++) {
company c = children.get(i);
c.display(depth + 2);
}
}
@Override
public void lvxingzhize() {
for (int i = 0; i < children.size(); i++) {
company c = children.get(i);
c.lvxingzhize();
}
}
}
package 公司管理;
public class Client {
public static void main(String[] args) {
concreteCompany root = new concreteCompany("北京总共公司");
root.add(new renliziyuanbu("总公司人力资源部"));
root.add(new caiwubu("总公司财务部"));
concreteCompany c1 = new concreteCompany("上海华东分公司");
c1.add(new renliziyuanbu("华东分公司人力资源部"));
c1.add(new caiwubu("上海华东分公司财务部"));
root.add(c1);
concreteCompany c2 = new concreteCompany("上海华东分公司南京办事处");
c2.add(new renliziyuanbu("上海华东分公司南京办事处资源部"));
c2.add(new caiwubu("上海华东分公司南京办事处财务部"));
c1.add(c2);
concreteCompany c3 = new concreteCompany("上海华东分公司杭州办事处");
c3.add(new renliziyuanbu("上海华东分公司杭州办事处资源部"));
c3.add(new caiwubu("上海华东分公司杭州办事处财务部"));
c1.add(c3);
System.out.println("公司结构图:");
root.display(1);
System.out.println("各部门职责:");
root.lvxingzhize();
}
}