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();

    }
}
posted @ 2023-02-16 09:47  Oh,mydream!  阅读(12)  评论(0编辑  收藏  举报