当前位置: 首页 > news >正文

《设计模式系列》---组合模式

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

组合模式:

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

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

/**
 * @author stefanie zhao
 * @date 2014-8-21 下午01:41:21
 */
public abstract class Company {

    protected String name;

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

    public abstract void add(Company c);

    public abstract void remove(Company c);

    public abstract void display(int depth);

    public abstract void lineOfDuty();
}
import java.util.ArrayList;
import java.util.List;

/**
 * @author stefanie zhao
 * @date 2014-8-21 下午01:43:13
 */
public class ConcreteCompany extends Company {

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

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

    @Override
    public void add(Company c) {
        children.add(c);
    }

    @Override
    public void remove(Company c) {
        children.remove(c);
    }

    @Override
    public void display(int depth) {
        System.out.println(Util.getString(depth) + name);
        for (Company c : children)
            c.display(depth + 2);
    }

    @Override
    public void lineOfDuty() {
        for (Company c : children)
            c.lineOfDuty();

    }

}
/**
 * @author stefanie zhao
 * @date 2014-8-21 下午01:43:13
 */
public class FinanceDepartment extends Company {

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

    @Override
    public void add(Company c) {
    }

    @Override
    public void remove(Company c) {
    }

    @Override
    public void display(int depth) {
        System.out.println(Util.getString(depth) + name);
    }

    @Override
    public void lineOfDuty() {
        System.out.format(" %s 公司财务收支管理", name);
    }

}
/**
 * @author stefanie zhao
 * @date 2014-8-21 下午01:43:13
 */
public class HRDepartment extends Company {

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

    @Override
    public void add(Company c) {
    }

    @Override
    public void remove(Company c) {
    }

    @Override
    public void display(int depth) {
        System.out.println(Util.getString(depth) + name);
    }

    @Override
    public void lineOfDuty() {
        System.out.format(" %s 员工招聘培训管理", name);
    }

}
/**
 * @author stefanie zhao
 * @date 2014-8-21 下午01:48:01
 */
public class Util {
    public static String getString(int depth) {
        String a = "";
        for (int i = 0; i < depth; i++)
            a += "-";
        return a;
    }
}
public class Main {
    public static void main(String[] args) {
        ConcreteCompany root = new ConcreteCompany("北京总公司");
        root.add(new HRDepartment("总人力资源"));
        root.add(new FinanceDepartment("总财务"));

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

        ConcreteCompany nj = new ConcreteCompany("南京办事处");
        nj.add(new HRDepartment("南京办事处人力资源"));
        nj.add(new FinanceDepartment("南京办事处财务"));
        comp.add(nj);

        root.display(1);

        root.lineOfDuty();

    }
}


转载于:https://my.oschina.net/stefanzhlg/blog/308118

相关文章:

  • Exchange 2013sp1邮件系统部署-(九)
  • 点与不规则图形关系判断
  • Android开发之初识Camera图像采集
  • jQuery找到GridView控件ItemTemplate模版内的控件
  • 禁止执行某些讨厌的程序,如tadb.exe
  • 一个很好地免费域名dot.tk
  • 解决问题是根本,多余的话不说(转)
  • cocos2d-x Touch触屏事件
  • Unity 游戏开发技术学生作品展2014版
  • 你好,C++(6)2.3 C++兵器谱
  • JavaScript学习笔记(九)---- BOM
  • Delphi XE7 GPS控件android下的新变化
  • 如何查找SAP的事务代码清单
  • Chart.js
  • R语言学习路线图-转帖
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • css选择器
  • Django 博客开发教程 8 - 博客文章详情页
  • extjs4学习之配置
  • Git学习与使用心得(1)—— 初始化
  • markdown编辑器简评
  • 第2章 网络文档
  • 读懂package.json -- 依赖管理
  • 多线程事务回滚
  • 工程优化暨babel升级小记
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 前端js -- this指向总结。
  • 算法系列——算法入门之递归分而治之思想的实现
  • 学习使用ExpressJS 4.0中的新Router
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 从如何停掉 Promise 链说起
  • 树莓派用上kodexplorer也能玩成私有网盘
  • #WEB前端(HTML属性)
  • #宝哥教你#查看jquery绑定的事件函数
  • (007)XHTML文档之标题——h1~h6
  • (9)STL算法之逆转旋转
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (转)程序员疫苗:代码注入
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .net core 连接数据库,通过数据库生成Modell
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net 获取url的方法
  • .NET 使用配置文件
  • .NET序列化 serializable,反序列化
  • @Conditional注解详解
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @Mapper作用
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [C#][DevPress]事件委托的使用
  • [echarts] y轴不显示0
  • [java] 23种设计模式之责任链模式
  • [JS]JavaScript 简介
  • [LeetCode周赛复盘] 第 310 场周赛20220911