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-组合模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式15:组合模式

2016-10-15坚持学习Day6组合模式

二十三种设计模式[15] - 解释器模式(Interpreter)

组合模式 - 设计模式 - PHP版

初学设计模式之组合模式

我可以创建单例 vaadin 组合框组件吗?