15-组合模式
Posted Oh,mydream!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
以上是关于15-组合模式的主要内容,如果未能解决你的问题,请参考以下文章