Java设计模式之组合模式

概述:本文继续探究Java设计模式,本次给大家带来的是java设计模式中的组合模式。故事是这样的:假设你在公司上班,因为你的公司是大公司,所以旗下有很多子公司,到年终了,公司希望在年会上汇总各个子公司的销售情况,好根据利润在年会上奖励给优秀的子公司,派发给各个员工。好的,现在老板让你计算出这些利润,把数值汇总给他,一再叮嘱你不能出错。老板交给你的事,肯定不能马虎,所以你小心翼翼的写起了代码….

                        公司的结构图如下:

Java设计模式之组合模式_第1张图片
看到这个结构图,你就在想,该怎么组织代码呢,如果每个公司写一个类,那么一个类中有一个方法,如果公司需要汇总分公司一和旗下子公司的钱,你又要在分公司一和二类里面分别写一个方法,这样算下来,方法就爆炸了,扩展性也不好,如果公司的子公司远不止这么点的话,那就有的你写了…各位码农兄弟们
好的,常规方法介绍完毕,开始我们的设计模式吧!有木有激动啊,(激动个锤子,写代码还激动…)好吧,当我没说.所谓组合模式,一般用来描述部分和整体的关系,类似于数据结构中的树,有根节点,叶子节点。这里的总公司就相当于根节点,两个分公司相当于子节点,子节点下面分别有两个叶子节点。

所以呢,我们具体可以分为以下的几个类:
1.Company抽象类
2.headCompany类(代表总公司)
3.branch_Company1类(代表子公司一)
4.branch_Company2类(代表子公司二)
5.bj_branch类(代表子公司一下的北京公司)
6.sh_branch(代表子公司一下的上海公司)
7.bj_branch类(代表子公司二下的广州公司)
8.sh_branch(代表子公司二下的深圳公司)
9. Client类(主函数,用来调用函数)
(有的网友可能开始喷我了,尼玛,你这样类不一样爆炸了嘛…举得例子不是很适当,主要是理解这种思想!!!其他的忽略一下下)

             小二,代码呢,快上代码,来了,客官
 package com.example.tianhaobing;

/**
 * @author tianhao
 *公司的抽象类,这里为什么公司使用抽象呢,有的朋友会说,接口也一样啊,如果你也这么认为,那我只能告诉你,
 *朋友,你没搞清楚抽象和接口的区别呀,简单来说吧,抽象类只要是描述什么是什么的关系,而接口表达的是什么像什么
 *的关系。很明显,这里的子公司,分公司,都是公司,所以用抽象来定义,而不用接口
 */
public abstract class Company {
    abstract int make_Money();
    abstract void money_Info();

}     
package com.example.tianhaobing;

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

/**
 * @author tianhao 总公司的类
 */
public class headCompany extends Company {
    List Total_Info = new ArrayList(); // 用来打印总公司下面所有公司的信息
    private int money = 1000;// 这里只是举个例子,真正公司赚这么点,早就垮了...

    public headCompany(Company company1,Company company2) {
        Total_Info.add(company1);
        Total_Info.add(company2);
    }

    @Override
    int make_Money() {
        // TODO Auto-generated method stub
        for (Company company : Total_Info) {
            money += company.make_Money();
        }
        return money;
    } // 公司全年的总支出

    @Override
    void money_Info() {
        // TODO Auto-generated method stub
        System.out.println("总公司的收入金额为:" + money);
        for (Company company : Total_Info) {
            company.money_Info();

        }
    } // 各个公司的支出信息

}
package com.example.tianhaobing;

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

/**
 * @author tianhao 分公司一的类
 */
public class branch_Company1 extends Company {
    List companys = new ArrayList();// 因为分公司一下面有北京和上海两个子公司,所以可以组合在一起
    private int my_money = 300;
    private int branch1_money=300;

    public branch_Company1(Company c1, Company c2) {
        // TODO Auto-generated constructor stub
        companys.add(c1);
        companys.add(c2);
    } // 将两个子公司合并组合起来

    @Override
    int make_Money() {
        // TODO Auto-generated method stub
        for (Company company : companys) {
            branch1_money += company.make_Money();
        }
        System.out.println("分公司一和旗下公司收入为:"+branch1_money);
        return branch1_money;
    }

    @Override
    void money_Info() {
        // TODO Auto-generated method stub
        System.out.println("分公司一的收入金额为:" + my_money);
        for (Company company : companys) {
            company.money_Info();
        }

    }

}
package com.example.tianhaobing;

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

/**
 * @author tianhao 分公司二的类
 */
public class branch_Company2 extends Company {
    List companys = new ArrayList();// 因为分公司二下面有广州和深圳两个子公司,所以可以组合在一起
    private int money = 400;
    private int branch2_money=400;

    public branch_Company2(Company c1, Company c2) {
        // TODO Auto-generated constructor stub
        companys.add(c1);
        companys.add(c2);
    } // 将两个子公司合并组合起来

    @Override
    int make_Money() {
        // TODO Auto-generated method stub
        for (Company company : companys) {
            branch2_money += company.make_Money();
        }
        System.out.println("分公司二和旗下公司收入为:"+branch2_money);
        return branch2_money;
    }

    @Override
    void money_Info() {
        // TODO Auto-generated method stub
        System.out.println("分公司二的收入金额为:" + money);
        for (Company company : companys) {
            company.money_Info();
        }
    }

}
package com.example.tianhaobing;

/**
 * @author tianhao
 * 
 *         北京公司
 */
public class bj_branch extends Company {
    private int money = 1000;

    @Override
    int make_Money() {
        // TODO Auto-generated method stub
        return money;
    }

    @Override
    void money_Info() {
        // TODO Auto-generated method stub
        System.out.println("北京公司收入为:" + money);
    }

}
package com.example.tianhaobing;

public class sh_branch extends Company {
    private int money = 1000;

    @Override
    int make_Money() {
        // TODO Auto-generated method stub
        return money;
    }

    @Override
    void money_Info() {
        // TODO Auto-generated method stub
        System.out.println("上海公司收入为:" + money);
    }

}
package com.example.tianhaobing;

public class gz_branch extends Company {

    private int money = 1000;

    @Override
    int make_Money() {
        // TODO Auto-generated method stub
        return money;
    }

    @Override
    void money_Info() {
        // TODO Auto-generated method stub
        System.out.println("广州公司收入为:" + money);
    }

}
package com.example.tianhaobing;

public class sz_branch extends Company {
    private int money = 1000;

    @Override
    int make_Money() {
        // TODO Auto-generated method stub
        return money;
    }

    @Override
    void money_Info() {
        // TODO Auto-generated method stub
        System.out.println("深圳公司收入为:" + money);
    }
}
package com.example.tianhaobing;

public class Client {
    public static void main(String[] args) {
        bj_branch bj = new bj_branch(); // 北京公司
        sh_branch sh = new sh_branch();// 上海公司
        branch_Company1 branch1 = new branch_Company1(bj, sh);// 将北京和上海两个公司组合到子公司一

        sz_branch sz = new sz_branch();// 深圳公司
        gz_branch gz = new gz_branch();// 广州公司
        branch_Company2 branch2 = new branch_Company2(sz, gz);// 将深圳和广州两个公司组合到子公司二


        headCompany head_Company=new headCompany(branch1,branch2);
        head_Company.money_Info();
        int total_money=head_Company.make_Money();
        System.out.println("公司全部的收入是:"+total_money);


    }
}
                        **运行结果如下所示:**

Java设计模式之组合模式_第2张图片

每个类的功能在类中都有详细的解释,其实组合模式在获取公司的利润的时候实质是采用的递归,不知大家看出来没,有什么问题,欢迎大家留言,我看到一定回复,共同进步嘛。

你可能感兴趣的:(Java设计模式之组合模式)