15-组合模式
15-组合模式
概念
组合模式(Composite), 将对象组合成属性结构以表示"部分-整体"的层次结构,组合模式将使得用户对单个对象和组合对象的使用具有一致性
透明方式与安全方式
透明方式:在Component中声明所有用来管理子对象的方法,其中包括add,remove等,这样实现Component接口的所有子类都具备add和remove接口,这样做的好处就是叶节点和枝节点对于外界没有区别,具有完全一致的行为接口,问题也很明显,叶子节点本身不具有add,remove方法的功能,所有实现它是没有意义的。
安全方式:在Component中不去声明add,remove方法,这样叶节点不用实现它,在Composite声明所有用来管理子类对象的方法,由于不够透明,所以树叶和树枝类将不具有相同的接口,客户端的调用需要做响应的判断,带来了不便
什么时候使用组合模式?
需求中是体现部分与整体层次的结构时,或者希望用户可以忽略组合对象与单个对象的不同,统一地使用组合接口狗中的所有对象时,就应该考虑使用组合模式
实现
package com.gof.composite;
/**
* 公司抽象类
*
* @since 2023-02-16
*/
public abstract class Company {
protected String name;
public Company(String name) {
this.name = name;
}
abstract void add(Company company);
abstract void remove(Company company);
abstract void display(int depth);
abstract void lineOfDuty();
}
package com.gof.composite;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 功能描述
*
* @since 2023-02-16
*/
public class ConcreteCompany extends Company {
List<Company> companies = new ArrayList<>();
public ConcreteCompany(String name) {
super(name);
}
@Override
void add(Company company) {
companies.add(company);
}
@Override
void remove(Company company) {
companies.remove(company);
}
@Override
void display(int depth) {
System.out.println(String.join("", Collections.nCopies(depth, "-")) + name);
for (Company com : companies) {
com.display(depth + 2);
}
}
@Override
void lineOfDuty() {
for (Company com : companies) {
com.lineOfDuty();
}
}
}
package com.gof.composite;
import java.util.Collections;
/**
* 功能描述
*
* @since 2023-02-16
*/
public class FinanceDepartment extends Company {
public FinanceDepartment(String name) {
super(name);
}
@Override
void add(Company company) {
}
@Override
void remove(Company company) {
}
@Override
void display(int depth) {
System.out.println(String.join("", Collections.nCopies(depth, "-")) + name);
}
@Override
void lineOfDuty() {
System.out.println(name + " 公司财务收支管理");
}
}
package com.gof.composite;
import java.util.Collections;
/**
* 功能描述
*
* @since 2023-02-16
*/
public class HrDepartment extends Company {
public HrDepartment(String name) {
super(name);
}
@Override
void add(Company company) {
}
@Override
void remove(Company company) {
}
@Override
void display(int depth) {
System.out.println(String.join("", Collections.nCopies(depth, "-")) + name);
}
@Override
void lineOfDuty() {
System.out.println(name + " 员工招聘培训课程");
}
}
package com.gof.composite;
/**
* 功能描述
*
* @since 2023-02-16
*/
public class Client {
public static void main(String[] args) {
ConcreteCompany root = new ConcreteCompany("北京总公司");
root.add(new HrDepartment("总公司人力资源部"));
root.add(new FinanceDepartment("总公司财政部"));
ConcreteCompany huaDong = new ConcreteCompany("华东分公司");
huaDong.add(new HrDepartment("华东分公司人力资源部"));
huaDong.add(new FinanceDepartment("华东分公司财政部"));
root.add(huaDong);
ConcreteCompany nanJing = new ConcreteCompany("南京办事处");
nanJing.add(new HrDepartment("南京办事处人力资源部"));
nanJing.add(new FinanceDepartment("南京办事处财政部"));
root.add(nanJing);
root.display(1);
root.lineOfDuty();
}
}