首页 > 其他分享 >20230426 19. 组合模式 - 分公司

20230426 19. 组合模式 - 分公司

时间:2023-06-19 09:57:02浏览次数:38  
标签:分公司 20230426 name 19 void add Company company public

介绍

组合模式(Composite),将对象组合成树形结构以表示'部分-整体'的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

组合模式

  • Component为组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为
  • Leaf在组合中表示叶节点对象,叶节点没有子节点
  • Composite定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关的操作

树可能有无数的分枝,但只需要反复用Composite就可以实现树状结构了

为什么Leaf类当中也有add和remove,树叶不是不可以再长分枝吗?

  • 这种方式叫作 透明方式 ,也就是说,在Component中声明所有用来管理子对象的方法,其中包括add、remove等。这样实现Component接口的所有子类都具备了add和remove。这样做的好处就是叶节点和枝节点对于外界没有区别,它们具备完全一致的行为接口。但问题也很明显,因为Leaf类本身不具备add()、remove()方法的功能,所以实现它是没有意义的
  • Leaf类当中不用add和remove方法,就需要 安全方式 ,也就是在Component接口中不去声明add和remove方法,那么子类的Leaf也就不需要去实现它,而是在Composite中声明所有用来管理子类对象的方法,这样做就不会出现刚才提到的问题,不过由于不够透明,所以树叶和树枝类将不具有相同的接口,客户端的调用需要做相应的判断,带来了不便

当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式了

组合模式定义了包含基本对象和合对象的类层次结构。基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去,客户代码中,任何用到基本对象的地方都可以使用组合对象了

用户是不用关心到底是处理一个叶节点还是处理一个组合组件,也就用不着为定义组合而写一些选择判断语句了

组合模式让客户可以一致地使用组合结构和单个对象

类似 Spring MVC 中的 HandlerMethodArgumentResolverComposite 以及一系列以 Composite 结尾的类

代码示例

Component

public abstract class Company {
    protected String name;

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

    public abstract void add(Company company);

    public abstract void remove(Company company);

    //显示
    public abstract void display(int depth);

    //履行职责
    public abstract void lineOfDuty();

}

Composite

public class CompanyComposite extends Company {
    private List<Company> companies = new ArrayList<>();

    public CompanyComposite(String name) {
        super(name);
    }

    @Override
    public void add(Company company) {
        companies.add(company);

    }

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

    @Override
    public void display(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print("-");
        }
        System.out.println(name);
        for (Company company : companies) {
            company.display(depth + 2);
        }
    }

    @Override
    public void lineOfDuty() {
        for (Company company : companies) {
            company.lineOfDuty();
        }
    }
}

Leaf

public class FinanceDepartment extends Company {
    public FinanceDepartment(String name) {
        super(name);
    }

    @Override
    public void add(Company company) {

    }

    @Override
    public void remove(Company company) {

    }

    @Override
    public void display(int depth) {
        for (var i = 0; i < depth; i++) {
            System.out.print("-");
        }
        System.out.println(name);
    }

    @Override
    public void lineOfDuty() {
        System.out.println(name + " 公司财务收支管理");
    }
}


public class HRDepartment extends Company {
    public HRDepartment(String name) {
        super(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 Test {
    public static void main(String[] args) {
        CompanyComposite root = new CompanyComposite("北京总公司");
        root.add(new HRDepartment("总公司人力资源部"));
        root.add(new FinanceDepartment("总公司财务部"));

        CompanyComposite hdComp = new CompanyComposite("上海华东分公司");
        hdComp.add(new HRDepartment("华东分公司人力资源部"));
        hdComp.add(new FinanceDepartment("华东分公司财务部"));
        root.add(hdComp);

        CompanyComposite njComp = new CompanyComposite("南京办事处");
        njComp.add(new HRDepartment("南京办事处人力资源部"));
        njComp.add(new FinanceDepartment("南京办事处财务部"));
        hdComp.add(njComp);

        CompanyComposite hzComp = new CompanyComposite("杭州办事处");
        hzComp.add(new HRDepartment("杭州办事处人力资源部"));
        hzComp.add(new FinanceDepartment("杭州办事处财务部"));
        hdComp.add(hzComp);

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

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

标签:分公司,20230426,name,19,void,add,Company,company,public
From: https://www.cnblogs.com/huangwenjie/p/17490369.html

相关文章

  • 20230426 20. 迭代器模式
    介绍迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。为遍历不同的聚集结构提供......
  • Android - 无法使用任何临时 SqlClient 版本(v2.1.4、v4.1.0、v5Preview)连接到 SQL Ser
    Aconnectionwassuccessfullyestablishedwiththeserver,butthenanerroroccurredduringthepre-loginhandshake.设法用证书和IP地址解决它。使用powershell为您的IP地址创建证书:New-SelfSignedCertificate-certstorelocationcert:\localmachine\my-dns......
  • 给Nexus6p刷入lineage14.1(android 7.1)和 nethunter 2019.3
    本文依据kali教程编写https://build.nethunter.com/contributors/re4son/angler/INSTALLATION.txt写在前面的话你可能很奇怪,为什么有kali2020.3不用要刷入2019.3版本的。其实目的是使用安卓7,因为高版本安卓对某些软件的兼容性太差,刷入2019载手动升级到2020.3.Andrax在安卓7、9......
  • luogu P1963 [NOI2009] 变换序列
    luoguP1963[NOI2009]变换序列题意对于\(N\)个整数\(0,1,\cdots,N-1\),一个变换序列\(T\)可以将\(i\)变成\(T_i\),其中\(T_i\in\{0,1,\cdots,N-1\}\)且\(\bigcup_{i=0}^{N-1}\{T_i\}=\{0,1,\cdots,N-1\}\)。,\(\forallx,y\in\{0,1,\cdots,N-1\......
  • 搭建发卡平台需要什么配置的服务器?103.219.30.x
    能看到这篇文章的,多数都是想要搭建自己的发卡平台,搭建发卡平台需要有源码、备案域名和服务器,今天我就给你们分享一下搭建发卡平台用什么服务器配置比较好?发卡网对服务器的稳定性和安全性的要求相对一般,如果是按照云服务器的配置来选择,建议宜高不宜低,配置越高,稳定性和安全性就越好。......
  • [GXYCTF2019]Ping Ping Ping 1
    先尝试输入ip=127.0.0.1发现啥也没有再次在后面输入ls查看文件发现有两个文件Cat一下发现有空格过滤进行空格绕过$(IFS)(?ip=127.0.0.1;cat$IFS$1flag.php)发现符合也进行了过滤尝试进行拼接flag?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php发现flag......
  • [极客大挑战 2019]Havefun
    [极客大挑战2019]Havefunf12查看代码,发现进行审计:$cat=$_GET['cat'];#get一个变量名字为cat​echo$cat;#显示cat​if($cat=='dog')#判断cat是否为dog{​echo'Syc{cat_cat_cat_cat}';#如果cat=dog那么输出(初次判断{}中为flag因为有{})}解法:get一个cat变......
  • [极客大挑战2019]EasySQL** 1
    [极客大挑战2019]EasySQL**1得到flag。万能密码"or"a"="a')or('a'='aor1=1--'or1=1--a'or'1=1--"or1=1--'or'a'='a"or"="a'='a'or''=......
  • AGC019F Yes or No
    题意有\(N+M\)个问题,其中有\(N\)个问题的答案是YES,\(M\)个问题的答案是NO。当你回答一个问题之后,会知道这个问题的答案,求最优策略下期望对多少。答案对\(998244353\)取模。数据范围:\(1\leN,M\le5\times10^5\)。题解首先每次必定去猜那个个数更多的问题。用点\((......
  • 【剑指Offer】19、顺时针打印矩阵
    【剑指Offer】19、顺时针打印矩阵题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4X4矩阵:12345678910111213141516则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.解题思路:由于是按照从外到内的顺序依次打......