说说-设计模式之 组合模式

本文介绍了组合模式,一种用于表示部分与整体层次结构的设计模式。通过创建对象的树形结构,组合模式使得客户端可以统一地处理单个对象和组合对象。文中以公司组织结构为例,展示了如何用Java实现总公司、分公司和部门之间的层次关系,包括添加、删除和显示结构等功能。通过这种方式,解耦了客户程序与复杂元素的内部结构。
摘要由CSDN通过智能技术生成

介绍:

1.组合模式又叫部分-整理模式,他创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次结构。

2.组合模式依据树形结构来组合对象,用来表示整体和部分层次。

3.组合模式使得用户对单个对象和组合对象的访问具有一致性,即组合能让客户以一致的方式处理个别对象以及组合对象。

角色说明:

1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。

2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。

3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。

组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以像处理简单元素一样来处理复杂元素。

场景:

  1.学校中的学院,学院中的院系。

  2.公司中不同的部门。

案例:

总公司-分公司-部门

/**
 * 公司职责
 */
public interface Company {

    void add(Company company);

    void remove(Company company);

    void display(int depth);

    void lineOfDuty();

}

import java.util.ArrayList;
import java.util.List;

public class ConcreteCompany implements Company {

    private String name;

    private List<Company> companyList = new ArrayList<Company>();

    public ConcreteCompany(String name) {
       this.name=name;
    }

    @Override
    public void add(Company company) {
        this.companyList.add(company);
    }

    @Override
    public void remove(Company company) {
        this.companyList.remove(company);
    }

    @Override
    public void display(int depth) {
        //输出树形结构
        for(int i=0; i<depth; i++) {
            System.out.print('-');
        }
        System.out.println(name);
        //下级遍历
        for (Company component : companyList) {
            component.display(depth + 1);
        }
    }

    @Override
    public void lineOfDuty() {
        //职责遍历
        for (Company company : companyList) {
            company.lineOfDuty();
        }
    }

}
public class DesignCompany implements Company {

    private String name;

    private List<Company> companyList = new ArrayList<Company>();

    public DesignCompany(String name) {
        this.name = name;
    }

    @Override
    public void add(Company company) {
    }

    @Override
    public void remove(Company company) {
    }


    @Override
    public void display(int depth) {
        //输出树形结构的子节点
        for (int i = 0; i < depth; i++) {
            System.out.print('-');
        }
        System.out.println(name);
    }

    @Override
    public void lineOfDuty() {
        System.out.println(name + " : 公司设计部门管理");
    }


}
public class HRDepartment implements Company {

    private String name;

    public HRDepartment(String name) {
        this.name=name;
    }

    @Override
    public void add(Company company) {

    }

    @Override
    public void remove(Company company) {

    }

    @Override
    public void display(int depth) {
        //输出树形结构的子节点
        for(int i=0; i<depth; i++) {
            System.out.print('-');
        }
        System.out.println(name);
    }

    @Override
    public void lineOfDuty() {
        System.out.println(name + " : 员工招聘培训管理");
    }

}
public class Client {

    public static void main(String[] args) {
        //总公司
        ConcreteCompany root = new ConcreteCompany("总公司");
        root.add(new HRDepartment("总公司人力资源部"));
        root.add(new DesignCompany("总公司设计部"));

        //分公司
        ConcreteCompany company = new ConcreteCompany("上海分公司");
        company.add(new HRDepartment("上海分公司人力资源部"));
        company.add(new DesignCompany("上海分公司设计部"));
        root.add(company);

        System.out.println("结构图:");
        root.display(1);

        System.out.println("\n职责:");
        root.lineOfDuty();
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值